-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Chapter 2.0 数当てゲームをプログラムする #4
Comments
標準ライブラリを使用する入出力を行うための標準ライブラリとして std::io を使用する ライブラリを使用するためには、以下のようにC#言語のような記述をファイルの先頭部分に書く。
デフォルトで使用できる標準ライブラリとして
|
2.2.1 値を変数に保持する入力した文字列を格納するための変数を以下のように定義する let mut guess = String::new(); Rustでは変数はデフォルトで宣言すると immutable となり変更不可能な状態で作成される。 let foo = 5;
for = 3; // ここでコンパイルエラーが発生します。 Rustでは 宣言後に可変な値を持てるようにするには let mut foo = 5; のようにletの後ろに 右辺の |
標準入力からの値の読み込み
参照については第4章に説明があるらしい。 |
2.2.2 Result型で失敗の可能性を扱うread_lineメソッドは、渡された文字列にユーザが入力したものを入れ込むだけでなく、
以下のように
|
println!マクロのプレースホルダーで値を出力する
{}は、プレースホルダーで引数に指定した値をフォーマットして文字列として表示します。 |
秘密の数字を生成するユーザーが当てる数字を毎回、異なる数字にするために乱数発生をする。 Rustの標準ライブラリには、乱数機能がないが、 Rustの開発チームがrandクレートを用意してくれています。 リポジトリからクレートを取得するには Cargo.tomlの [dependencies] セクションの下に取得したいクレートを記述する。
この状態で cargo buildを実行するとリポジトリから dependenciesに記載したクレートを取得するとともにそのクレートが依存している別のクレートへの依存関係を解決して一緒にダウンロードを行います。
利用するクレートがダウンロードできたので、ソースにそれを使用する宣言を記述します。 extern crate rand;
use std::io;
use rand::Rng;
次に、別のuse行を追加しています: use rand::Rngですね。Rngトレイトは ちなみにこの記述を削除すると、以下のようなエラーメッセージが表示され
|
予想と秘密の数字を比較するRustには、強い静的型システムがあります。 しかし、型推論にも対応しています。let guess = String::new()と書いた時、コンパイラは、 guessがString型であるはずと推論してくれ、その型を明示させられることはありませんでした。 一方で、secret_number変数は、数値型です。1から100を表すことができる数値型はいくつかあります: i32は32ビットの数字; u32は32ビットの非負数字; i64は64ビットの数字などです。 Rustでの標準は、i32型であり、型情報をどこかに追加して、コンパイラに異なる数値型だと推論させない限り、 secret_numberの型はこれになります。 入力値を文字列として読み込んだ変数
Rustでは、新しい値でguessの値を覆い隠す(shadow)ことが許されているため以下のように記述することができます。これは値を別の型に変換したいシチュエーションでよく使われます。 シャドーイング(shadowing)のおかげで別々の変数を2つ作らされることなく、guessという変数名を再利用することができます。
let guess: u32として :の後ろに型を指定することでコンパイラに変数の型を注釈として与えることができます。
これを修正したものを動かすと
|
ループで複数回の予想を可能にする複数回実行を行うためにloop ブロックで囲む。 loopブロックで囲むことでインデントのネストを深くする必要がありソースコードが見にくくなってしまう。 インストールは以下のコマンドで行う
使用方法は、
|
正しい予想をした後に終了する正しい答えを当てた場合に終了したい。正解を出したら loopを
不正な入力を処理するparseの処理でpanicとしているものがあるが Result型を返すのでNGの適切な処理を行う。 expectメソッドの呼び出しからmatch式に切り替えることは、 エラーでクラッシュする動作からエラー処理を行う処理に変更する一般的な手段になります。
このOk値は、最初のアームのパターンにマッチし、このmatch式はparseメソッドが生成し、 Ok値に格納したnumの値を返すだけです。その数値が最終的に、生成している新しいguess変数として欲しい場所に存在します。 parseメソッドは、文字列から数値への変換に失敗したら、エラーに関する情報を多く含むErr値を返します。 このErr値は、最初のmatchアームのOk(num)というパターンにはマッチしないものの、 2番目のアームのErr(_)というパターンにはマッチするわけです。この_は、包括値です; この例では、 保持している情報がどんなものでもいいから全てのErr値にマッチさせたいと宣言しています。 |
プログラムは1から100までの乱数整数を生成します。そしてプレーヤーに予想を入力するよう促します。予想を入力したら、プログラムは、 その予想が小さすぎたか大きすぎたかを出力します。予想が当たっていれば、ゲームは祝福メッセージを表示し、 終了します。
The text was updated successfully, but these errors were encountered: