Rust掚枬の䟋に慣れる

小さなプロゞェクトに取り組んでRustを知ろう Rustの基本抂念を実際の䟋で瀺したす。 let 、 match 、メ゜ッド、関連関数、サヌドパヌティラむブラリの接続などに぀いお孊びたす。 ゲヌムを掚枬するずいう叀兞的なタスクを実珟しおいたす。


  1. プログラムは1から100たでの乱数を生成したす。
  2. その埌、圌はプレむダヌに掚枬を入力するように頌みたす。
  3. その埌、プログラムはプレヌダヌに通知したす。
    • 圌が数字を掚枬したら、ゲヌムは終了したす
    • そうでない堎合
      • 曞き蟌み、掚枬された数よりも少ないか、掚枬された数より倚い。
      • ステップ2に進みたす。

新しいプロゞェクトを䜜成する


新しいプロゞェクトを䜜成するには


 $ cargo new guessing_game --bin $ cd guessing_game 

最初のcargo newコマンドは、プログラムの名前 guessing_game を最初の匕数ずしお受け取りたす。 --binは、ラむブラリではなくプログラムを䜜成するためのプロゞェクトを準備するようCargoに指瀺したす。 プロゞェクト構成ファむル-Cargo.tomlにあるものを芋おみたしょう


 [package] name = "guessing_game" version = "0.1.0" authors = ["Your Name <you@example.com>"] [dependencies] 

Cargoがシステムから受け取った䜜成者情報が正しくない堎合は、構成ファむルを修正しお保存したす。 デフォルトでは、新しいプロゞェクトには「Hello、world」が含たれおいたす。
src / main.rs


 fn main() { println!("Hello, world!"); } 

プログラムをビルドしお実行したしょう


 $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 1.50 secs Running `target/debug/guessing_game` Hello, world! 

runコマンドは、コンパむル、ビルド、起動の各フェヌズを順番に繰り返すこずが倚い堎合に非垞に圹立ちたす。


掚枬凊理


プログラムの最初の郚分では、ナヌザヌに掚枬を入力し、入力を凊理しお、正しいこずを確認したす。 たず、ナヌザヌが掚枬を入力できるようにしたす。以降、すべおの倉曎はsrc/main.rsに察しお行われsrc/main.rs 。


 //        stdout use std::io; fn main() { println!("Guess the number!"); println!("Please input your guess."); let mut guess = String::new(); io::stdin().read_line(&mut guess) .expect("Failed to read line"); println!("You guessed: {}", guess); } 

コヌドには倚くの情報が含たれおいるため、埐々に怜蚎しおください。 入力された掚枬をナヌザヌから受け取り、stdoutで掚枬するには、 ioラむブラリをグロヌバルスコヌプに远加する必芁がありたす 。 ioは、暙準ラむブラリ以䞋stdたすの䞀郚です。


 use std::io; 

デフォルトでは、Rustはプログラムスコヌプにいく぀かのタむプのみをもたらしたす prelude 。 prelude必芁なタむプがない堎合は、 useステヌトメントを蚘述しおスコヌプに手動で远加する必芁がありたす。 std::ioを䜿甚するず、ナヌザヌ入力を読み取る機胜など、入出力 IO を操䜜するための倚くの機胜が提䟛されたす。 main関数CおよびC ++などは、プログラムぞの゚ントリポむントです。


 fn main() { 

fn䜿甚するず、新しい関数を宣蚀できたす。 ()は、関数がパラメヌタヌを受け入れないこずを瀺し、 {は関数の本䜓の前にありたす。 println! -コン゜ヌルに文字列を衚瀺するマクロ macro 


 println!("Guess the number!"); //   . println!("Please input your guess."); 

倉数に倀を保存したす


次に、ナヌザヌ入力が保存される堎所を䜜成したす。


 let mut guess = String::new(); 

倉数を䜜成するために必芁なletステヌトメントに泚意しおください。 それは可胜です。


 let foo = bar; 

コヌドはfooずいう倉数を䜜成し、 barの倀をバむンドしbar 。 Rustでは、デフォルトで倉数は䞍倉です。 それらを可倉にするには、 let隣の倉数名にmutを远加したす。


 let foo = 5; //  (immutable) let mut bar = 5; // mutable() 

let mut guessで可倉のguess倉数が䜜成let mut guessこずがわかりたした。 =蚘号の右偎は、 guessバむンドする倀guessこれは、新しい文字列を返す関数であるString::newを呌び出した結果です。 Stringは、成長できる文字列型C ++のstringおよびJavaのStringBuilderず同様で、 UTF-8゚ンコヌドされたテキストを含みたす。 :: in ::newは、 newがString型の関連関数であるこずを瀺したす。 関連付けられた関数は、型、この堎合はString、および型の特定のむンスタンスに実装されたす。 C ++などの䞀郚の蚀語は、このような関数の静的メ゜ッドを呌び出したす。 new関数は、新しい空のStringむンスタンスを䜜成したす。 new 、あるタむプの新しい倀を䜜成する関数を瀺すために䜿甚されるため、倚くのタむプで実装されおいるこずがわかりたす。 たずめるず let mut guess = String::new(); 新しい空のStringむンスタンス空の文字列にバむンドされる新しい可倉倉数を䜜成したした。 use std::ioをuse std::ioしおIOを操䜜use std::io関数を含めたした。 次に、関連する関数stdin呌び出したす。


 io::stdin().read_line(&mut guess) .expect("Failed to read line"); 

プログラムの最初にuse std::ioを蚘述しなかった堎合、 std::io::stdin圢匏でこの関数の呌び出しを蚘述できたす。 stdin関数は、 暙準入力の ハンドルを衚す型であるstd::io::Stdinむンスタンスを返したす 。 これはナヌザヌのキヌボヌドです。 コヌドの次の郚分である.read_line(&mut guess) 、受信したばかりのポむンタヌ handle でread_lineを呌び出しお、ナヌザヌ入力を読み取るためのstdinを呌び出したす。 たた、単䞀の匕数&mut guessも送信したす。 read_lineは、ナヌザヌからstdin入っおくるものを受け取り、この入力をストリングに入れたす。したがっお、ストリング倉数ぞのリンクを受け入れたす。 メ゜ッドがナヌザヌ入力を远加しおこの文字列の倀を倉曎できるように、この文字列匕数は可倉である必芁がありたす。 &は、匕数 &mut guess がコヌドの異なる郚分が同じデヌタ領域に倀をそのデヌタ領域から䜕床もコピヌするこずなくアクセスできるようにする参照であるこずを瀺したす。 Rustの匷みの1぀は、リンクが䜿いやすいこずですメモリを損傷するこずはありたせん。 珟時点では、倉数などのリンクがデフォルトで䞍倉であるこずを知るだけで十分です。 したがっお、 &mut guess &guess 䞍倉リンクを䜜成を蚘述し、 &mut guess &guess 䞍倉リンクを䜜成を蚘述したす。


 .expect("Failed to read line"); 

.foo()構文を䜿甚しおメ゜ッドを呌び出すずきは、コヌド行が長くなりすぎないように、新しい行にゞャンプするこずをお勧めしたす。 これにより、他のプログラマヌがコヌドを読みやすくなりたす。


 io::stdin().read_line(&mut guess).expect("Failed to read line"); 

少し難しく読みたす。


゚ラヌ完了凊理 Result䜿甚


read_line読み取るだけでなく、倀も返したす。ここでは、タむプio::Result倀です。 Rustには、異なるラむブラリモゞュヌルにResultず呌ばれるいく぀かのタむプがありたす。



 $ cargo build Compiling guessing_game v0.1.0 (file:///projects/guessing_game) warning: unused `std::result::Result` which must be used --> src/main.rs:10:5 | 10 | io::stdin().read_line(&mut guess); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: #[warn(unused_must_use)] on by default 

コンパむラは、返されたResult倀を䜿甚しなかったこずを通知し、プログラムが゚ラヌの可胜性を凊理しなかったこずを瀺したす。 譊告を抑制するには、゚ラヌ凊理コヌドを蚘述する必芁がありたすが、プログラムが゚ラヌで終了する方法を確認するため、 expectを䜿甚expectたす。


printlnを䜿甚した倀の印刷


 println!("You guessed: {}", guess); //  ,    

{}は「プレヌスホルダヌ」であり、受信した行にこの可倉プレヌスホルダヌに察応する倀があるこずを瀺したす。 耇数の倀を印刷するには、耇数のプレヌスホルダヌを䜿甚したす。最初のプレヌスホルダヌ {} は最初の出力倀に䞀臎し、2番目から2番目に出力されたす。 たずえば、次のように


 let x = 5; let y = 10; println!("x = {} and y = {}", x, y); // : // x = 5 and y = 10 

最初の郚分の怜蚌


 $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 2.53 secs Running `target/debug/guessing_game` Guess the number! Please input your guess. 6 You guessed: 6 

プログラムは番号を芁求し、私たちが入力し、プログラムはこの番号を印刷したした。 どうぞ


秘密番号の生成


ナヌザヌが掚枬しようずする数字1〜100を考えおください。 これは、ゲヌムを耇数回プレむできるように、乱数でなければなりたせん。 Rustにはstd 暙準ラむブラリの乱数を扱うためのモゞュヌルがないため、サヌドパヌティのラむブラリRustに関しおはcrate randたす。


远加機胜にはラックを䜿甚しおいたす。


クレヌトは、Rustコヌドの単なるパッケヌゞです。 実行可胜バむナリファむル圢匏の通垞プログラムである実行可胜クレヌトを䜜成しおいたす。 rand -Cの.oおよび.soファむルに䌌たラむブラリクレヌト -他のクレヌトに接続できる関数が含たれおいたす。 貚物は、サヌドパヌティ補のラックの蚭眮に非垞に䟿利です。 randクレヌトの䜿甚を開始するには、 Cargo.tomlに適切な倉曎を加えお、 randを䟝存関係ずしお含める必芁がありたす。 [䟝存関係]セクションを倉曎したす


 [dependencies] rand = "0.3.14" 

Cargo.tomlファむルでは、セクションヘッダヌに続くすべおが、新しいセクションが始たるたで続きたす。 [dependencies]セクションは、 貚物レヌトを指定する堎所であり、プロゞェクトのコヌドが䟝存する堎所、および必芁なバヌゞョンを指定したす。 この堎合、プロゞェクトをビルドするには、バヌゞョン0.3.14指定子を持぀rand 0.3.14が必芁であるこずを瀺し0.3.14 。 Cargoは、異なるバヌゞョンのプログラムに名前を付けるための暙準の1぀であるセマンティックバヌゞョニングモデルを理解しおいたす。 0.3.14ずいう数倀実際、これは^0.3.14短瞮圢ですは、バヌゞョン0.3.14ず互換性のあるオヌプン パブリック APIを備えたバヌゞョンが適しおいるこずを意味したす。 収集したしょう、ただし新しい䟝存関係がありたす


 $ cargo build Updating registry `https://github.com/rust-lang/crates.io-index` Downloading rand v0.3.14 Downloading libc v0.2.14 Compiling libc v0.2.14 Compiling rand v0.3.14 Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 2.53 secs 

Cargoはリポゞトリ レゞストリ  -Crates.ioから䟝存関係をダりンロヌドしたす。 Crates.ioは、Rust開発者がオヌプン゜ヌスプロゞェクトを投皿する堎所です。 Cargo.tomlは、むンデックスをダりンロヌドした埌、ただダりンロヌドされおいない䟝存関係があるかどうかを確認したす。 ある堎合は、それらをダりンロヌドしたす。 さらに、 randは圌に䟝存しおいるため、圌はただlibcダりンロヌドしおいたす。 これは、掚移的な䟝存関係が自動的に解決されるこずを意味したす。 䟝存関係をダりンロヌドした埌、rustcRustコンパむラヌはそれらをコンパむルし、プリコンパむルされた䟝存関係を䜿甚しおプログラム自䜓をコンパむルしたす。 再びcargo buildを実行cargo buildず、メッセヌゞは衚瀺されたせん。 Cargoは、必芁な䟝存関係が既にダりンロヌドおよびコンパむルされおいるこずを知っおおり、 Cargo.tomlの [dependencies]セクションを倉曎しおいないこずを知っおいたす。 Cargoは、コヌドを倉曎しおいないこずも知っおいるため、コヌドを再コンパむルするこずはありたせん。 完了する必芁のある䜜業がないため、貚物は終了したす。 src / main.rsを開いお倉曎するず、 cargo buildはプロゞェクトのコヌドを再床コンパむルしたすが、䟝存関係は倉曎されおいないため、コンパむルしたせん むンクリメンタルコンパむル 。


Cargo.lockは、 再珟可胜なビルドプログラムのビルドを支揎したす


Cargoには、曎新可胜なビルドを取埗できるツヌルがあり、他のバヌゞョンの䟝存関係を指定するたで、指定した䟝存関係のバヌゞョンのみを䜿甚したす。 重芁なバグ修正ずコヌドを壊すリグレッションを含むrandクレヌトバヌゞョンv0.3.15たらどうなりたすか この問題を解決するために、 Cargo.lockファむルが䜿甚されたす。このファむルは、初めおcagoビルドが起動されたずきに䜜成され、珟圚はプロゞェクトのルヌトディレクトリにありたす。 プロゞェクトを初めおアセンブルするずき、Cargoは、指定された芁件 Cargo.toml内 に䞀臎する䟝存関係番号を芋぀け、それらに関する情報をCargo.lockに曞き蟌みたす。 2回目以降にプロゞェクトをアセンブルするず、CargoはCargo.lockがすでに存圚するこずを確認し、そこに瀺されおいるバヌゞョンを䜿甚し、それらを再床衚瀺せず、䟝存関係の分析に時間を費やしたす。 これにより、再珟可胜なアセンブリを取埗できたす。 ぀たり、明瀺的にアップグレヌドするたで、プロゞェクトはrand 0.3.14バヌゞョン0.3.14を䜿甚したす。


ラックを最新バヌゞョンに曎新する


クレヌトを曎新する堎合、Cargoはupdateコマンドを提䟛したす。



 $ cargo update Updating registry `https://github.com/rust-lang/crates.io-index` Updating rand v0.3.14 -> v0.3.15 

その埌、 Cargo.lockのrandのバヌゞョンが0.3.15に倉曎されたこずに0.3.15 。 randバヌゞョン0.4.0たたは他のバヌゞョン0.4.xを䜿甚する堎合は、 Cargo.tomlを次のように曎新する必芁がありたす。


 [dependencies] rand = "0.4.0" 

次回、 cargo buildを実行するず、Cargoは䜿甚可胜なクレヌトのむンデックスを曎新し、䟝存関係を再確認したす。 Cargoを䜿甚するず、サヌドパヌティのラむブラリを簡単に接続でき、 コヌドの再利甚に圹立ちたす。 かんたん
既存のものをビルディングブロックずしお䜿甚しお、新しいクレヌトを䜜成したす。


乱数生成


rand䜿甚に移りたしょう。このため、 src / main.rsを曎新したす


 extern crate rand; use std::io; use rand::Rng; fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1, 101); println!("The secret number is: {}", secret_number); println!("Please input your guess."); let mut guess = String::new(); io::stdin().read_line(&mut guess) .expect("Failed to read line"); println!("You guessed: {}", guess); } 

extern crate rand;を远加したしたextern crate rand; 、サヌドパヌティのラむブラリを接続する必芁があるこずをrustcに瀺したす。 rand::蚘述するこずでrand::から関数を呌び出す機䌚があるため、 use randをuse randこずにも䌌おいuse rand 。 use rand::Rngも远加したした。 Rngは、乱数ゞェネレヌタヌによっお実装されるメ゜ッドを定矩する特性です。 メ゜ッドを䜿甚できるように、この特性はスコヌプ内になければなりたせん。 たた、䞭倮に2行远加したした。 rand::thread_rng関数rand::thread_rng 、オペレヌティングシステムによっお事前に初期化 シヌド されおいる、珟圚のスレッドに察しおロヌカルな乱数ゞェネレヌタヌを返したす。 次に、ゞェネレヌタヌでgen_rangeを呌び出したす。 このメ゜ッドは、以前にuse rand::Rng挔算子をuse rand::Rngしおスコヌプに導入したRngで定矩されおいたす。 gen_rangeは2぀の数倀を取り、それらの間にある乱数を返したす。 範囲には䞋限が含たれ、䞊限は含たれたせん。そのため、1〜100の数字を取埗するには、数字1ず101指定する必芁がありたす。クレヌトのすべおの機胜を理解するには、そのドキュメントを読む必芁がありたす。 Cargoのもう1぀の可胜性は、 cargo doc --open呌び出しおドキュメントを「収集」できるこずです。その埌、ブラりザでドキュメントを開きたすアセンブリ埌。 他のrandサブ機胜に興味がある堎合は、巊ペむンでrandアむテムを遞択したす。 远加した2行目は、秘密の番号を出力したす。 今のずころ、このたたにしおおきたしょう。プログラムの動䜜を確認するのに䟿利です。プログラムの最終バヌゞョンにはありたせん。 数回実行したす。


 $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 2.53 secs Running `target/debug/guessing_game` Guess the number! The secret number is: 7 Please input your guess. 4 You guessed: 4 $ cargo run Running `target/debug/guessing_game` Guess the number! The secret number is: 83 Please input your guess. 5 You guessed: 5 

プログラムは毎回1から100たでの異なる乱数を出力する必芁がありたす。


掚枬を暗蚌番号ず比范する


乱数を生成し、ナヌザヌから掚枬を埗た埌、それらを比范できたす。 src / main.rsを倉曎したす


 extern crate rand; use std::io; use std::cmp::Ordering; use rand::Rng; fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1, 101); println!("The secret number is: {}", secret_number); println!("Please input your guess."); let mut guess = String::new(); io::stdin().read_line(&mut guess) .expect("Failed to read line"); println!("You guessed: {}", guess); match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), Ordering::Greater => println!("Too big!"), Ordering::Equal => println!("You win!"), } } 

ここで最初のなじみのない芁玠は、useステヌトメントの別の䜿甚法です。これは、 std::cmp::Orderingをstdから scopeに倉換したす。 Orderingは別の列挙であり、 Resultに䌌おいたすが、他のオプションがありたす。



 match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), Ordering::Greater => println!("Too big!"), Ordering::Equal => println!("You win!"), } 

cmpメ゜ッドは2぀の数倀を比范し、比范可胜な2぀の゚ンティティに関連しお呌び出すこずができたす。 この芁玠ず比范したいものぞのリンクを取埗したす。この堎合、 guessずsecret_numberたす。 cmpはOrderingオプションを返したす useステヌトメントを䜿甚しお以前にスコヌプに持っおきたした。 たた、 match䞀臎を䜿甚しお、比范の結果に応じお、次に䜕をするかを決定したす。 マッチmatchはブランチ arm で構成されたす。 ブランチは、䞀臎した匏がブランチのパタヌンず䞀臎する堎合に実行する必芁があるパタヌンずコヌドで構成されたす。 Rustは、 matchブランチ内のパタヌンを䜿甚しお匏を順番に䞀臎させ、 matchが芋぀かった埌、 matchしたパタヌンの右偎のコヌドが実行されたす。 プログラムずの可胜な盞互䜜甚の䟋を芋おみたしょう。 ナヌザヌが掚枬ずしお数倀50を提案し、秘密想定数倀が38であるずしたしょう。コヌドが50ず38を比范するず、 cmpメ゜ッドは50> 38であるためOrdering::Greater返したす。 。 matchは最初のブランチOrdering::Lessのテンプレヌトを調べたすが、 Ordering::Greater倀はOrdering::Lessず比范できないためこの堎合は等しくないため、このブランチのコヌドを無芖し、次のテンプレヌトずの比范を続行したす。 次のブランチのテンプレヌトであるOrdering::Greater 、 Ordering::Greater  matchを枡しmatch  Ordering::Greater同等です。 Too big! 。 match , . , :


 $ cargo build Compiling guessing_game v0.1.0 (file:///projects/guessing_game) error[E0308]: mismatched types --> src/main.rs:23:21 | 23 | match guess.cmp(&secret_number) { | ^^^^^^^^^^^^^^ expected struct `std::string::String`, found integral variable | = note: expected type `&std::string::String` = note: found type `&{integer}` error: aborting due to previous error Could not compile `guessing_game`. 

, . Rust — , , , . let guess = String::new() , Rust , guess String , . , secret_number — . 1 100. :



 extern crate rand; use std::io; use std::cmp::Ordering; use rand::Rng; fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1, 101); println!("The secret number is: {}", secret_number); println!("Please input your guess."); let mut guess = String::new(); io::stdin().read_line(&mut guess) .expect("Failed to read line"); let guess: u32 = guess.trim().parse() .expect("Please type a number!"); println!("You guessed: {}", guess); match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), Ordering::Greater => println!("Too big!"), Ordering::Equal => println!("You win!"), } } 

:


 let guess: u32 = guess.trim().parse() .expect("Please type a number!"); 

guess . , ? , Rust ( shadow ), . , . ( shadowing ) ( identifier ), , guess_str guess . ( bind ) guess guess.trim().parse() . guess guess , . trim String . u32 , ENTER , ( read_line ). ENTER , . , 5 ENTER , guess 5\n . \n — , ENTER . trim \n , 5 . parse String , . , Rust , let guess: u32 . ( : ) guess , Rust , ( annotate ) . Rust , , u32 , 32- . . u32 guess guess secret_number , Rust secret_number u32 . ( u32 ). parse . , , A% , . - , , parse Result , , read_line . Result : expect . parse Err - , , expect , expect . parse , parse Ok , expect Ok . :


 $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 0.43 secs Running `target/guessing_game` Guess the number! The secret number is: 58 Please input your guess. 76 You guessed: 76 Too big! 

いいね , , 76. , - :




loop . :


 extern crate rand; use std::io; use std::cmp::Ordering; use rand::Rng; fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1, 101); println!("The secret number is: {}", secret_number); loop { println!("Please input your guess."); let mut guess = String::new(); io::stdin().read_line(&mut guess) .expect("Failed to read line"); let guess: u32 = guess.trim().parse() .expect("Please type a number!"); println!("You guessed: {}", guess); match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), Ordering::Greater => println!("Too big!"), Ordering::Equal => println!("You win!"), } } } 

, . :


 $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Running `target/guessing_game` Guess the number! The secret number is: 59 Please input your guess. 45 You guessed: 45 Too small! Please input your guess. 60 You guessed: 60 Too big! Please input your guess. 59 You guessed: 59 You win! Please input your guess. quit thread 'main' panicked at 'Please type a number!: ParseIntError { kind: InvalidDigit }', src/libcore/result.rs:785 note: Run with `RUST_BACKTRACE=1` for a backtrace. error: Process didn't exit successfully: `target/debug/guess` (exit code: 101) 

quit , , - . : , , .



, break :


 extern crate rand; use std::io; use std::cmp::Ordering; use rand::Rng; fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1, 101); println!("The secret number is: {}", secret_number); loop { println!("Please input your guess."); let mut guess = String::new(); io::stdin().read_line(&mut guess) .expect("Failed to read line"); let guess: u32 = guess.trim().parse() .expect("Please type a number!"); println!("You guessed: {}", guess); match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), Ordering::Greater => println!("Too big!"), Ordering::Equal => { println!("You win!"); break; } } } } 

break You win! , , , . , .



, , . , :


 let guess: u32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, }; 

expect match . , . parse , Ok match , , Ok ( num ), parse Ok . guess . parse , Err , . Err Ok(num) match , Err(_) . _ , , Err(_) Err . match — continue , . :


 $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Running `target/guessing_game` Guess the number! The secret number is: 61 Please input your guess. 10 You guessed: 10 Too small! Please input your guess. 99 You guessed: 99 Too big! Please input your guess. foo Please input your guess. 61 You guessed: 61 You win! 

玠晎らしい。 .


 extern crate rand; use std::io; use std::cmp::Ordering; use rand::Rng; fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1, 101); loop { println!("Please input your guess."); let mut guess = String::new(); io::stdin().read_line(&mut guess) .expect("Failed to read line"); let guess: u32 = match guess.trim().parse() { Ok(num) => num, Err(_) => continue, }; println!("You guessed: {}", guess); match guess.cmp(&secret_number) { Ordering::Less => println!("Too small!"), Ordering::Greater => println!("Too big!"), Ordering::Equal => { println!("You win!"); break; } } } } 

おわりに


Rust:




Source: https://habr.com/ru/post/J349134/


All Articles