Rust:Guessing Game

以下に従って、ハンズオン実施。 doc.rust-lang.org

標準入力から1行読み取る

use std::io;

fn main() {
    let mut input = String::new();
    io::stdin().read_line(&mut input).expect("Failed to read line");
}
  • 変数はデフォルトで不変(immutable)。可変(mutable)にするには、mutをつける
  • 関連関数(associated function)は::で呼び出す
  • &は参照(reference)
  • Resultは列挙型(enum)で、OkとErrを表す
  • expect()メソッドで、エラー時のメッセージを設定できる

乱数の生成

Cargo.toml

[dependencies]
rand = "0.8.5"
  • クレートは外部ライブラリのようなもの「crate is a collection of Rust source code files」
  • Cargo.tomlファイルに記述すると、crates.io: Rust Package Registryから取得する
  • "0.8.5"と指定した場合、0.8.5以上、0.9.0未満で最新バージョンを取得する
  • 初回ビルド時にCargo.lockファイルが作成され、詳細なバージョン情報が記載される
  • 最新バージョンにアップデートする場合は、cargo updateコマンドを実行する
  • "0.9.0"以上にアップデートする場合は、Cargo.tomlを修正する
use rand::Rng;
fn main(){
   //1~100までの乱数を生成
    let secret_number = rand::thread_rng().gen_range(1..=100);
    println!("The secret number is: {}", secret_number);
}

文字列の数値型変換と、大小比較

use std::cmp::Ordering;

fn main(){
    // --snip--
    loop {
        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };
    
        match guess.cmp(&secret_number) {
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal => {
                println!("You win!");
                break;
            }
        }
    }
}
  • loopで無限ループを作成する
  • continueでloopを継続、breakでloopを抜ける
  • parse()メソッドはResult型を返す
  • match式で、Ok,Errのハンドリングをする
  • _は、すべての値にマッチする
  • cmp()メソッドは、列挙型のOrderingを返す
  • OrderingはLess,Greater,Equalのいずれかの値をとる
  • シャドウィング(Shadowing)により、同じ名前の変数を再定義することができる