初めおのRust FizzBu​​zz実装が機胜しない理由

蚘事の完党な元のタむトル 「最初のFizzBu​​zz実装が機胜しない理由Rustの最初は驚くほど優れた郚分の調査ただ奜きではないかもしれたせんが」



tl; dr; -version 䞀芋、Rustの䞀郚は奇劙で䞍䟿に思えるかもしれたせんが、システム蚀語ずしお䜍眮付けられた蚀語では非垞に成功しおいるこずがわかりたした。 所有暩ず存続期間の抂念により、蚀語に匷力な静的保蚌をもたらし、そのプログラムをメモリから随時有効か぀安党にするこずができたす。



ラむセンス  クリス・モヌガンによるCC-BY 。



最初のFizzBu​​zz実装が機胜しない理由最初は衝撃的であるが、実際には最高のポむントであるRustの機胜の調査ただ奜きではないかもしれたせんが

http://chrismorgan.info/media/images/rust-fizzbuzz.svg FizzBu​​zzは初心者向けの単玔な割り圓おず想定されおいたすが、Rustにはいく぀か知っおおくべき萜ずし穎がありたす。 これらの萜ずし穎はRustの問題ではなく、ほずんどのプログラマヌがよく知っおいるものずの違いであり、䞀芋非垞に厳しい制限ですが、実際には䜎䟡栌で倧きな利点を提䟛したす。



Rustは「動く暙的」ですが、蚀語はより安定したす。 この蚘事のコヌドは、バヌゞョン0.12で機胜したす。 䜕かが壊れたら、 私に連絡しおください 。 Pythonコヌドに関しおは、2぀ず3぀の䞡方で機胜したす。



簡単な実装



OK、最初のFizzBu​​zzの実装は機胜しない可胜性があるずタむトルで蚀いたした。 以䞋の䟋のように曞くこずができたす。 簡朔にするために、 fn main() { 
 }



省略しfn main() { 
 }



。 PythonのコヌドがRustよりも短いこずに懞念がある堎合、Pythonには特別な圢匏のコヌドがありたす。チェックボックスをクリックするず䜿甚できたす。  元の蚘事の玄レヌン、Pythonコヌドをfrom __future__ import braces



「特別な圢匏」に切り替えるチェックボックスがありたす
。これは著者のむヌスタヌ゚ッグのようなものです 。
個別のprint



ステヌトメントを䜿甚したFizzBu​​zzの実装すべおが機胜したす。
Python さび
 for i in range(1, 101): if i % 15 == 0: print('FizzBuzz') elif i % 5 == 0: print('Buzz') elif i % 3 == 0: print('Fizz') else: print(i)
      
      





 for i in range(1i, 101) { if i % 15 == 0 { println!("FizzBuzz"); } else if i % 5 == 0 { println!("Buzz"); } else if i % 3 == 0 { println!("Fizz"); } else { println!("{}", i); } }
      
      







どちらのプログラムも望たしい結果を生み出し、明らかに非垞によく䌌おいたす。 ここで蚀及する䟡倀のある䞻なこずは、Rustではprintln!()



[1]が最初の匕数ずしお文字列リテラル、フォヌマット文字列を必芁ずするこずです。 察応するPythonコヌドは、 print('{}'.format(i))



たす。



しかし、コヌド内のprint



呌び出しの重耇を取り陀きたい堎合はどうでしょうか これは次のようなものです。
1぀のprint



ステヌトメントを含むFizzBu​​zz。
Python Rustコンパむルされおいない
 for i in range(1, 101): if i % 15 == 0: result = 'FizzBuzz' elif i % 5 == 0: result = 'Buzz' elif i % 3 == 0: result = 'Fizz' else: result = i print(result)
      
      





 for i in range(1i, 101) { let result = if i % 15 == 0 { "FizzBuzz" } else if i % 5 == 0 { "Buzz" } else if i % 3 == 0 { "Fizz" } else { i }; println!("{}", result); }
      
      







Rustでif



ブロック党䜓を匏ずしお䜿甚する方法に泚目しおください。 割り圓おの結果でさえ本圓に必芁ではありたせん。ブロック党䜓を䜿甚する構造に詰め蟌むこずができたす。 Pythonではすべおが呜什ではなく匏であるため、これはルビストにずっおは非垞によく知られたアプロヌチですが、パむニストにずっおはそうではありたせん。 このアプロヌチに懐疑的であれば、私は理解しおいたす。 Rustを理解し始めたずき、Rustの匏の偏りずreturn



を省略する機胜は奇劙に思えたした。 しかし、Rustを䜿甚するず、そうではないこずに気付きたした。 これは実際に玠晎らしいです。



Pythonは5幎前から私のお気に入りの蚀語でしたが、この蚀語でプロずしお曞き続けおいるにもかかわらずRustに切り替えたいず思いたすが、Rustチップが欠けおいるこずがよくありたす。 Rustを䜿甚する堎合、Rustにはただないラむブラリが必芁であるこずを陀いお、Pythonに同じ欠点はありたせん。 䞀般的に、Rustは私の目にPythonを倧きく非難したした。



錆びたコヌドは芋栄えが良いですが、実際にはこの蚀語の厳密な入力芏則のために機胜したせん。 では、 result



倉数のタむプは䜕ですか 最初の3぀のif



ブランチは文字列を返し、4番目は敎数を返したす



 f.rs:7:12116゚ラヌifずelseに互換性のない型がある堎合 ` 'static str`、found` int`expected-ptr、found int
 f.rs:7} else if i3 == 0 {
 f.rs:8「フィズ」
 f.rs:9} else {
 f.rs:10 i
 f.rs:11};
゚ラヌ前の゚ラヌのため䞭止


これは機胜したせん。 数字を文字列に倉えるのはどうですか
 for i in range(1i, 101) { let result = if i % 15 == 0 { "FizzBuzz" } else if i % 5 == 0 { "Buzz" } else if i % 3 == 0 { "Fizz" } else { i.to_string() }; println!("{}", result); }
      
      





ここでは、他のプログラミング蚀語 to_string



で倚くの人が䜿い慣れおいるチップを取り出し、あたり理解しおいない領域に適甚したした。 䞀般に、これは機胜したせん。



  f.rs:7:12116゚ラヌifずelseに互換性のない型がある堎合期埅される ` 'static str`、found`コレクション:: string :: String`expected-ptr、芋぀かった構造䜓コレクション:: string ::文字列
 f.rs:7} else if i3 == 0 {
 f.rs:8「フィズ」
 f.rs:9} else {
 f.rs:10 i.to_string
 f.rs:11};
゚ラヌ前の゚ラヌのため䞭止


「なに」「あなたはすべおの行ではないのですか」ず蚀うのが聞こえたす。 this &'static str



䞀䜓どういうこずですかAnd collections::string::String



 この段階では、ブランチによっお生成される倀のタむプをより慎重に分析する必芁がありたす。最初の3぀のブランチは、ある皮の「文字列」を生成するだけでなく、 &'static str



を生成し、4番目のブランチは単なる敎数ではなくint



たす。 Python、Ruby、JavaScriptなどの蚀語では、敎数型が結合されJSはさらに進んで、すべおの数倀型を完党に統合したした、C、Java、Goにはサむズが異なる敎数型が倚数ありたす。 しかし、C、Java、Goなどの蚀語でさえ、文字列に察しお1぀のタむプしかありたせん。



しかし、錆はそうではありたせん。 圌には2぀ありたす。



2皮類の文字列 それは䜕ですか



ここでは簡単な説明に限定しお先に進むこずができたすが、深く掘り䞋げたので、最埌たで行っお䜕が行われ、なぜそれが絶察に䟡倀があるのか​​を理解しおください。 それでは、なぜC♯、Java、Goは同じ文字列タむプで満足できるのに、Rustでは満足できないのでしょうか この質問に答えるには、メモリ管理のレベルたで䞋げる必芁がありたす。



C♯、Java、Goはすべおマネヌゞド蚀語です [2]  ガベヌゞコレクション蚀語ずも呌ばれたす。 ぀たり、適切なタむミングでメモリの割り圓おず割り圓お解陀を制埡する実行時のメカニズムがありたす。他に誰も文字列を䜿甚しない堎合、それは特別な堎合がありたす。 したがっお、文字列ぞのリンクをその寿呜を気にせずに返すこずができたす。ただ䜿甚䞭の文字列は特別なものではありたせん。



これらの蚀語には1぀の譲歩もありたす。 原則ずしお、それらには䞍倉䞍倉の行がありたす-2぀の行が連結されおいる堎合、必芁なサむズの新しい行にメモリが割り圓おられたす割り圓お。 これは、適切な堎合、FizzずBuzzを連結する゜リュヌションでは、15で割り切れる数倀に2぀の割り圓おがあるこずを意味したす。確かに、䞀郚の蚀語では、 文字列プヌルたたは抑留ず呌ばれるものを䜿甚しお、この悪圱響を少し滑らかにするこずができたすこのメカニズムの成功は、オプティマむザヌずコヌドの蚘述方法に䟝存したす代わりに、より倧きな悪があるため、行は䞍倉であるず思いたす-行を倉曎するず、それに応じお他の行に圱響を䞎える可胜性がありたす。 これは、プログラムの正確さに倧きく圱響し、基本的にプリミティブ型である競合状態に぀ながる可胜性がありたす。

たた、ナニコヌド行の堎合、これにより䞍正確な行カットが発生する可胜性がありたす。 もちろん、これらの問題は他の堎所でも発生したすが、それらを䞀列に䞊べるず、さらに悪化する可胜性がありたす。 これらの蚀語には1぀の文字列型があるず蚀いたしたが、これは完党に真実ではありたせんStringBuilder



ず.NETの䞡方にStringBuilder



ず呌ばれるメカニズムがあるなど、特殊な文字列型もありたす。



Rustモデルは、ガベヌゞコレクション蚀語で䜿甚されるモデルずは異なり、所有暩の抂念に基づいおいたす。 このモデルでは、各オブゞェクトには䞀床に1人の所有者 およそLaneが所有されおいたす があり、他の堎所ではそのオブゞェクトぞのポむンタヌを安党に取埗できたす。



collections::string::String



は所有暩を持぀型です。 これは、圌が株の内容を所有する独占的な暩利を持っおいるこずを意味したす。 このタむプのオブゞェクトがスコヌプを出るず、行は解攟されたす。 したがっお、文字列ず郚分文字列の間に接続がないため、郚分文字列をString



型にするこずはできたせん。最初の郚分文字列がスコヌプを離れるず、2番目の郚分文字列が䞍正確になりたす。 代わりに、郚分文字列たたは文字列スラむス は、他の誰かが所有するオブゞェクトぞの参照である型を䜿甚したす- &str



。 Rustは、オブゞェクトのラむフタむムの抂念のおかげで、単䞀の行スラむスが元の文字列を生き残らないこずを保蚌できるため、メモリの安党性が維持されたす。



生涯ガむドには、より詳现な説明がありたす 。 ここで、参照タむプの埌に'_



の構造が衚瀺される堎合、これがリンクの有効期間の決定方法であるこずに泚意しおください。 特別な'static



存続期間がありたす。これは、オブゞェクトがプログラム党䜓に存圚するこずを意味したす。 そのようなオブゞェクトは、コヌド内で芋぀かった文字列リテラルず同様に、実行可胜ファむルに盎接ベむク凊理され&'static str



。぀たり、文字列リテラル型&'static str



です。



以前は、 str



がBox<T>



であり、 str



が停であった堎合、type〜strはサむズ倉曎可胜な文字列型でした。 珟圚のサむズず最倧容量のサむズを、 String



の珟圚のタむプ ~str



眮き換えられたずしお保存したした。 すべおのラッパヌタむプは、この方法で動䜜するはずでした。 珟圚、 Box<T>



は単玔なラップされた倀です。 それが䜿甚されない理由です-远加容量なしでは、文字列に远加されるたびにメモリを再割り圓おする必芁がありたす。 String



はメモリを再割り圓おでき、デフォルトでこれを行いたす。 したがっお、 Box<str>



ず&str



の違い&str



重芁です。



この倉曎䞭に、新しい型がStrBuf



ず呌ばれたこずを远加できたす。 実際、状況は他の蚀語の状況ず倧差ありたせん。 実際、これは匷制的なガベヌゞコレクションの欠劂の圱響であり、䞀郚の&str



圹に立たないものになりたす。 Rustでは、他の蚀語ではメむンの文字列タむプに簡単にアクセスできるため、他の蚀語よりも文字列バッファに少し頻繁にアクセスする必芁がありたす。





FizzBu​​zzに戻る



぀たり、問題は、1぀のブランチに所有暩を持぀行があり、他の3぀の行は静的な文字列スラむス静的に定矩された文字列ぞのリンクであるずいうこずです。 この問題をどのように解決したすか たぶん、すべおの文字列スラむスを䜜成しようずしたすはい、任意のラむフタむム'a



&str



タむプ'b



が'b



より長い堎合、暗黙的に'b



キャストできたす。'staticは䜕よりも長いので、コンパむラは自由に実行できたす。適切なラむフタむムに倉換したす
 for i in range(1i, 101) { let result = if i % 15 == 0 { "FizzBuzz" } else if i % 5 == 0 { "Buzz" } else if i % 3 == 0 { "Fizz" } else { i.to_string().as_slice() }; println!("{}", result); }
      
      





いい考えですね。 申し蚳ありたせんが、これも機胜したせん

 f.rs:10:910:22゚ラヌ借甚した倀は十分に長く生きおいたせん
 f.rs:10 i.to_string。as_slice
                 ^ ~~~~~~~~~~~~~
 f.rs:2:25132泚参照は2:24のブロックに察しお有効でなければなりたせん...
 f.rs:2 for i in range1i、101{
 f.rsrouble let let = if i15 == 0 {
 f.rs:4 "FizzBu​​zz"
 f.rscla} else if i5 == 0 {
 f.rs:6「バズ」
 f.rs:7} else if i3 == 0 {
        ...
 f.rs:9:12116泚...ただし、借甚した倀は9:11の匏でのみ有効です
 f.rs:9} else {
 f.rs:10 i.to_string。as_slice
 f.rs:11};
゚ラヌ前の゚ラヌのため䞭止


ここで私たちは生呜にi.to_string()



たす i.to_string()



生成された行は十分な時間保存されず、ブロックの終わりに解攟されたす。 したがっお、それぞのリンクもブロックを離れるこずができたせん。 これは、Rustコンパむラヌが正垞にキャッチした無効なメモリヌぞのリンクに関連する朜圚的なバグです。 䞀郚の蚀語では、これは「ダングリングポむンタヌ」ず呌ばれ、非垞に悪いです。



ここで、ブロックごずに文字列倉数を単玔に䞊げるこずができたす。ルヌプの本䜓で文字列が有効であれば十分です。 時にはこれで十分ですが、倚くの堎合はそうではない状況に遭遇するこずがありたす。
 for i in range(1i, 101) { let x; let result = if i % 15 == 0 { "FizzBuzz" } else if i % 5 == 0 { "Buzz" } else if i % 3 == 0 { "Fizz" } else { x = i.to_string(); x.as_slice() }; println!("{}", result); }
      
      



リンクを囲むブロックに配眮したす。これは機胜したす。

すべおをString



たせんか



逆方向に進むず、すべおのブランチが所有暩を持぀行を返す必芁がありたす。
 for i in range(1i, 101) { let result = if i % 15 == 0 { "FizzBuzz".to_string() } else if i % 5 == 0 { "Buzz".to_string() } else if i % 3 == 0 { "Fizz".to_string() } else { i.to_string() }; println!("{}", result); }
      
      



私たちはすべおを䞀列に行いたすが、実行時に無料ではありたせん。



このアプロヌチはうたく機胜したすが、数倀を取埗するものだけでなく、反埩ごずにメモリが割り圓おられるこずを意味したす。



曞き蟌み機胜



コヌドを䞍条理に転がすこずなく、できるだけこの方向に進みたした。 問題のたさにステヌトメント、぀たり、結果を出力せずに関数から返すずいうステヌトメントを倉曎するのはどうですか



このコヌドから始めたしょう
String



を返すfizz_buzz



関数。
Python さび
 def fizz_buzz(i): if i % 15 == 0: return 'FizzBuzz' elif i % 5 == 0: return 'Buzz' elif i % 3 == 0: return 'Fizz' else: return i for i in range(1, 101): print(fizz_buzz(i))
      
      





 fn fizz_buzz(i: int) -> String { if i % 15 == 0 { "FizzBuzz".to_string() } else if i % 5 == 0 { "Buzz".to_string() } else if i % 3 == 0 { "Fizz".to_string() } else { i.to_string() } } for i in range(1i, 101) { println!("{}", fizz_buzz(i)); }
      
      





これで、远加レベルのカプセル化ができたした。 倉数が関数自䜓を離れるので、倉数をより高いレベルに持っおいくずいう決定がうたくいかない堎合だけを瀺しおいたす。

 自分で詊しおみるこずができたす 。適切なラむフタむムがないため、関数の戻り倀をRust型システムで衚すこずができたせんx



は'static



ラむフタむムを取埗できず、アタッチできるものがありたせん。」



たた、関数にコヌドを配眮するため、必芁のない堎合には新しい行を遞択したす。



SendStr



玹介



幞いなこずに、Rustは代数デヌタ型  enum



も呌ばれたす をサポヌトしおいたす。 たた、暙準ラむブラリには、文字列スラむスたたは所有暩文字列のいずれかであるオブゞェクトを蚘述するこずができる適切なタむプがありたす。



以䞋は、このタむプの定矩ですさらに䟿利になるメ゜ッドの説明はありたせん
 pub enum MaybeOwned<'a> { Slice(&'a str), Owned(String) } pub type SendStr = MaybeOwned<'static>;
      
      





std::str



のMaybeOwned



およびSendStr



。



Send



は、タスク間で぀たり、メモリの安党性を倱うこずなくスレッド間でオブゞェクトを安党に転送できるこずを瀺す制限です。 たた、オブゞェクトが自己完結型であり、関数から返すこずができるこずも意味したす。 SendStr



の定矩のように、 &'static str



ような文字列があるずしたす。 関数内のオブゞェクトぞの参照は含たれおいたせんよね したがっお、必芁な限り存圚できたす。 同じこずがString



も圓おはたりたす。 したがっお、これらの2぀のオブゞェクトのいずれかをenum



型でキャプチャできたす。これは、いずれかのオブゞェクトを所有しおいるこずを瀺したす。 したがっお、 SendStr



はSend



条件を満たしたす。 このタむプは特定の倀を栌玍し、ナヌザヌはその䞊でさたざたな操䜜を実行できたす 。 今最も泚目すべき事実は、 as_slice()



を䜿甚しおこの型から文字列スラむスを抜出できるこずです。 この型は、 std::fmt::Show



も実装しstd::fmt::Show



。぀たり、 {}



指定するこずで、曞匏付き出力で盎接䜿甚できたす Show



型は、Pythonの__str__()



たたはto_s()



、 toString()



、 &c



盎接の類䌌䜓__str__()



他の蚀語では、 writer



オブゞェクトず盎接連携するため、䞭間文字列オブゞェクトをto_string()



できたすto_string()



を実装する型でto_string()



を呌び出すず、このメカニズムも呌び出されたす。



アプリケヌションは次のようになりたす。

 use std::str::SendStr; fn fizz_buzz(i: int) -> SendStr { if i % 15 == 0 { "FizzBuzz".into_maybe_owned() } else if i % 5 == 0 { "Buzz".into_maybe_owned() } else if i % 3 == 0 { "Fizz".into_maybe_owned() } else { i.to_string().into_maybe_owned() } } for i in range(1i, 101) { println!("{}", fizz_buzz(i)); }
      
      





fizz_buzz関数はSendStr



返したす。 動䜜したす。

 .into_maybe_owned()



からIntoMaybeOwned



され、デフォルトで利甚可胜 



かっこいい これで、コンピュヌタヌが実行する必芁のある䜜業量が削枛され、よく知られた䟋が高速化されたした。

しかし、さらに先ぞ進むこずができたすか



独自のenum



型を䜜成し、 std::fmt::Show



を実装する



もちろん、送信するのは実際には「文字列」ではなく、これらは「Fizz」、「Buzz」、「FizzBu​​zz」、たたは数倀のいく぀かの倀です。 すべおのオプションを事前に文字列に倉換するだけです。 䞍芁な割り圓おを回避しお、これを簡単に遅延的に行うこずができたす実際、ここでのすべおの割り圓おは回避できたす。



独自のenum



䜜成したしょう。

このプロセスでは、 std::fmt::Show



も実装したす。これにより、䞭間行を必芁ずせずにstdout



に盎接出力できたす。
分離されたデヌタ型を䜿甚しお、可胜な倀のオプションを効率的に衚珟したす。
Pythonの同等物非垞にタむト さび
 class FizzBuzzItem: def __init__(self, value): self._value = value def __str__(self): if self is Fizz: return "Fizz" elif self is Buzz: return "Buzz" elif self is FizzBuzz: return "FizzBuzz" else: return str(self._value) # ,     Fizz = FizzBuzzItem(object()) Buzz = FizzBuzzItem(object()) FizzBuzz = FizzBuzzItem(object()) def Number(number): return FizzBuzzItem(number) def fizz_buzz(i): if i % 15 == 0: return FizzBuzz elif i % 5 == 0: return Buzz elif i % 3 == 0: return Fizz else: return Number(i) for i in range(1, 101): print(fizz_buzz(i))
      
      





 use std::fmt; enum FizzBuzzItem { Fizz, Buzz, FizzBuzz, Number(int), } impl fmt::Show for FizzBuzzItem { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { Fizz => f.write(b"Fizz"), Buzz => f.write(b"Buzz"), FizzBuzz => f.write(b"FizzBuzz"), Number(num) => write!(f, "{}", num), } } } fn fizz_buzz(i: int) -> FizzBuzzItem { if i % 15 == 0 { FizzBuzz } else if i % 5 == 0 { Buzz } else if i % 3 == 0 { Fizz } else { Number(i) } } for i in range(1i, 101) { println!("{}", fizz_buzz(i)); }
      
      







これはデヌタを衚瀺するのに本圓に良い方法であるこずに泚意しおください。ただし、この堎合はあたり気にせず、最初の3぀のブランチをWord(&'static str)



タむプ Word("FizzBuzz")



などに眮き換えるだけです。 実際には、これは私がこのステップで曞いた最初のバヌゞョンでした。これが䞍芁な文字列を䜿甚しおオンにしたのです



別のむテレヌタを曞くこずでさらに進めるこずができたすが、Rustでむテレヌタが機胜する方法を考えるず、これは完党にオプションです- range(1, 101).map(fizz_buzz)



簡単に曞くこずができたす。 これにより、柔軟性が倧幅に向䞊したす。 Iterator<int>



がどこかに実装されたら、最埌に.map(fizz_buzz)



を远加するだけで、 Iterator<FizzBuzzItem>



を実装する型を取埗できたす。



サむクルは、このスタむルで1回たたは2回曞き換えるこずができたす。
敎数反埩fizz_buzz



関数を䜿甚したす。

Python さび
 for f in map(fizz_buzz, range(1, 101)): print(f)
      
      





 for f in range(1, 101).map(fizz_buzz) { println!("{}", f); }
      
      







どちらの方法を遞択したずしおも、結果ずしお、叀き良きFizzBu​​zzプログラムを䜿い果たしおしたいたす。



おわりに



これで、最初のRust FizzBu​​zz実装が機胜しない理由がわかりたした。 この蚘事で説明されおいる難しさのいく぀かは静的に型付けされた蚀語に兞型的であり、いく぀かはRustに固有のものです。 実際、C ++の状況はC ++の状況ず䌌おいたすが、C ++を䜿甚するずバカな間違いをたくさんできるようになり、メモリを操䜜する保蚌がありたせん。ここで他の人を匕甚しおいるだけです。私はC ++を正しく知りたせん。



Rustの所有暩モデルのトピックず、それがどのようにあなたが慣れおいるスタむルで曞くこずを防ぐこずができるか、そしおなぜそうするのかを調べたしたただし、特定の利点に぀いおは説明したせん。 たた、 enum



型代数デヌタ型の効果的な抂念に぀いおも蚀及したした。これにより、デヌタをより厳密か぀効率的に蚘述するこずができたす。



これらすべおの力をご芧いただき、興味を持っおいただけたこずを願っおいたす。



説明されおいる远加のセマンティックロヌドはありたすか はい



䞍快ですか 定期的に。 私の経隓によれば、これはすべお、それが䜜成されるのず同じくらい頻繁に困難から救われたす。



これにより、プログラムの効率が向䞊したすか もちろん、そしお完党な自信を持っお。 以前は、これらのこずにはセキュリティず正確性の損倱が必芁でしたが、珟圚Rustでは、このような劥協は必芁ありたせん。



これはコヌドの䟵入を簡単にしたすか このような単玔なケヌスでは倧きな違いはありたせんが、耇雑なケヌスではこれらのメカニズムが本圓に圹立ちたす。 Pythonでそれらが本圓に恋しいです。



これらの抂念をたずめるず、良い面ず悪い面があるず蚀えたす。時にはあなたはそれらを愛し、時にはあなたはそれらを嫌いたす。しかし、少なくずも私はそれらをあたり頻繁に嫌いたせん。



Rustを䜿甚する必芁がありたすかたあ、少なくずも詊しおみるこずをお勧めしたす。システムプログラミングに重点が眮かれおいるため、未加工たたは目的に適さない堎合がありたす。倚くの高レベルのタスクでは、倚少面倒です。しかし、私は時が来お、Webプログラミングのようなもののためのクヌルなツヌルになるず信じおいたす。これはStrangeLoopでの講挔で話したしたスラむドもご芧いただけたす、2MB SVG。



最埌に、Rustを初めお䜿甚する堎合、たたは蚘事の䞀郚を理解しおいない堎合は、公匏ドキュメントに慣れるこずをお勧めしたす。; Rustの30分間の玹介では、所有暩の抂念が非垞によく説明されおいたす。たた、Hydeには、よく知られたenum



タむプなどがありたす。特定の問題に関する詳现なガむドもありたす。ただ質問がある堎合は、irc.mozilla.orgの#rustチャンネルのような堎所が倧いに圹立ちたす-私は長い間そこにいたす、私のニックネヌムはChrisMorganです。



FizzBu​​zzの最適化をいじるのが本圓に奜きなら



はい、お願いしたす。これは最終バヌゞョンであり、Rustの最新バヌゞョンでコンパむルするために必芁な最小限の修正ず、OUT



読みやすさを向䞊させるための文字列バヌゞョンがありたす。
 #![no_std] #![feature(asm, lang_items)] extern crate libc; static OUT: &'static [u8] = b"\ 1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n\ 16\n17\nFizz\n19\nBuzz\nFizz\n22\n23\nFizz\nBuzz\n26\nFizz\n28\n29\nFizzBuzz\n\ 31\n32\nFizz\n34\nBuzz\nFizz\n37\n38\nFizz\nBuzz\n41\nFizz\n43\n44\nFizzBuzz\n\ 46\n47\nFizz\n49\nBuzz\nFizz\n52\n53\nFizz\nBuzz\n56\nFizz\n58\n59\nFizzBuzz\n\ 61\n62\nFizz\n64\nBuzz\nFizz\n67\n68\nFizz\nBuzz\n71\nFizz\n73\n74\nFizzBuzz\n\ 76\n77\nFizz\n79\nBuzz\nFizz\n82\n83\nFizz\nBuzz\n86\nFizz\n88\n89\nFizzBuzz\n\ 91\n92\nFizz\n94\nBuzz\nFizz\n97\n98\nFizz\nBuzz\n"; #[start] fn start(_argc: int, _argv: *const *const u8) -> int { unsafe { asm!( " mov $$1, %rax mov $$1, %rdi mov $0, %rsi mov $$0x19d, %rdx syscall " : : "r" (&OUT[0]) : "rax", "rdi", "rsi", "rdx" : ); } 0 } #[lang = "stack_exhausted"] extern fn stack_exhausted() {} #[lang = "eh_personality"] extern fn eh_personality() {} #[lang = "fail_fmt"] extern fn fail_fmt() {}
      
      







翻蚳者のメモ

1. Rustには開発されたマクロシステムがあり、この堎合println!



はコンパむル時に特定のタむプに特化した呌び出しで展開されprintln



たす。

2.初めおオリゞナルを読むずき、マネヌゞドコヌドに぀いお話しおいるような印象を受けるかもしれたせんが、これはマネヌゞドメモリを指したす。括匧の内偎ず倖偎のさたざたな定匏化にもかかわらず、私たちは同じこずに぀いお話しおいる。



玠材は十分に倧きいため、翻蚳の文䜓的たたは意味的な゚ラヌはかなり可胜です。たた、私はRustおよび静的に型付けされた蚀語の専門家ではないずいう事実により、䞀郚のメカニズムの蚘述に䞍正確さが生じる可胜性がありたす。どちらの堎合も、プラむベヌトメッセヌゞで修正を送っおいただければ幞いです。

ご枅聎ありがずうございたした。



All Articles