Overview
The Rust Programing Language のチュートリアルにある「数当てゲーム」* をやってみました。
やった内容は以下にまとめてます。
*数当てゲームですが、日本語訳だとサンプルコードのシグネチャが古かったのでサンプルコードは英語版の方を参照することをお勧めします -> https://doc.rust-lang.org/stable/book/
Memo
クレートについて
クレートのエコシステムについてはまだ自分の中では色々手探り状態ではありますが、バイナリクレートとライブラリクレートがあって、ライブラリを追加する(Goでいう 3rd package を go get してきて使う)というのは ライブラリクレートを追加する
、という風に使いますし、クレートを追加する、という記述があるとだいたいこの ライブラリクレート
のことを指すようです。
どんなクレートがあるかは https://crates.io/ を参照すればわかります。pkg.go.dev や npmjs.com みたいなものですね。
Result 型を返り値に持つメソッドとパターンマッチについて
io::std::read_line
メソッドは Result 型を返すので match でパターンマッチでも書くことが可能です。
元々使用していた expect()
は Result 型の失敗の可能性を扱うのに使います。
このio::ResultオブジェクトがErr値の場合、expectメソッドはプログラムをクラッシュさせ、 引数として渡されたメッセージを表示します。read_lineメソッドがErrを返したら、 恐らく根底にあるOSによるエラーに起因するのでしょう。 このio::ResultオブジェクトがOk値の場合、expectメソッドは、Ok列挙子が保持する 返り値を取り出して、ただその値を返すので、これを使用することができるでしょう。 今回の場合、その返り値とは、ユーザが標準入力に入力したデータのバイト数になります。
io::stdin().read_line(&mut guess).exprect("Failed to ...")
と書くと、Result の結果が Ok だったらそのまま guess に結果が入って Err の場合に expect で指定したエラーメッセージが出力される、というデザインはいいですね。
新しい型での覆い隠し(Shadow)
Rust は変数の再代入があった場合にコンパイラがエラーを吐きますが、これとは別に別の型にして Shadow することは許可されてました。
Rustでは、新しい値でguessの値を覆い隠す(shadow)ことが許されているのです。
let mut guess = String::New() // 文字列型で定義 let guess: u32 = guess.trim().parse().expect("Please type a number!"); // uint32 で別型で覆い隠す (≠再代入)
一見再代入のように見えないこともないですが、これは再代入とは違います。
ちなみに変数の変換に利用されてる parse()
メソッドについてですが、parse も Reulst 型を返すのでパターンマッチで書くことが可能です。
※ ここでは変換不能な文字列( ex. aaa とか)が入ってきた場合でもエラーハンドリングせず無視して続行する実装にしてます。