ここを見て0からrustを勉強し始めた
https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/README.html
↑古かった
↓こっちが新しい
https://doc.rust-jp.rs/book/second-edition/ch02-00-guessing-game-tutorial.html
前回 の続きからソースを見ていく
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;
}
}
}
}
①
.expect(...) の部分、read_lineの戻り値がResult型でenum でOkかErrが返ってくる。
Errが返ってきた場合、expectでプログラムをクラッシュさせて、文字列を表示する。
expectを付けないでコンパイルした場合、Errが返ってくる可能性に対してハンドルしてないよ!!の警告を食らう、rustの世界厳しいっすね。
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
②
let guess: u32 = ... guess変数をunsigned 32bit 数値型で再定義している。
入れる内容は、read_lineで読み取った文字列型のguessを数値型にparseで変換をかける。
parseの戻り値もResult型なので、Errに対するハンドルをしないとワーニングがでてしまう。
matchを使って戻り値判定を行い、返ってきたEnumの列挙型ごとに処理を分岐させる。
Err(_)の場合、_は包括値で全てのエラーにマッチするらしい、他での応用も含めてもう少し調査が必要、ひとまずは文字列⇒数値へのパースに失敗したらcontiune。
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
③
最初に定義した乱数secret_numberをcmpに借用で渡す、戻り値がEnum型なのでmatchで判定して処理分岐。ここは直感的に理解できるな。
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {
println!("You win!");
break;
}
}
まずはここまで完全に理解した。