プログラミング言語Rust 3.1. 数当てゲーム つぶやきまとめ
数当てゲーム 写経時のつぶやき
!が付くとマクロ
— ちゃまぐ (@tyamaguc07) 2018年12月3日
変数束縛
関連関数 → スタティックメソッドと呼ぶ言語もある
io::Resultを使っていないと警告を出す
標準ライブラリには乱数の機能がまだない
「クレート」はRustのコードのパッケージ
--binで出来るのはバイナリクレート
Cargoはバージョン記述の標準、セマンティックバージョニングを理解する
— ちゃまぐ (@tyamaguc07) 2018年12月3日
rand="0.3.0"はrand="^0.3.0" の略記で、「0.3.0と互換性のあるもの」という意味
正確に 0.3.0 だけを使いたいなら rand="=0.3.0"と記す
Cargoはそれぞれの最新版をレジストリ—https://t.co/5P9nqOVeTUのコピー—から取得
https://t.co/5P9nqOVeTUはオープンソースのRustプロジェクトを投稿する場所
— ちゃまぐ (@tyamaguc07) 2018年12月3日
Cargoは基準を満たす全てのバージョンを探索し、 Cargo.lock ファイルに書き出す
その後のビルドではCargoはまず Cargo.lock ファイルがあるか確認し、再度バージョンを探索することなく、そこで指定されたバージョンを使う
cargo updateはロックを無視して、指定したバージョンを満たす全ての最新版を探し、出来たらそれをロックファイルに書き出す
— ちゃまぐ (@tyamaguc07) 2018年12月3日
0.3.0が指定されている場合、デフォルトでは0.3.0より大きく、0.4.0より小さいバージョンを探す
0.4.xより大きなバージョンを使いたいなら直接Cargo.tomlを更新する必要がある
extern crateでdependenciesで指定したクレートを使うことを宣言
— ちゃまぐ (@tyamaguc07) 2018年12月5日
extern crate rand; で内部的にはuser rand; まで行われる
メソッドは「トレイト」に定義される
メソッドが動作するには、対象となるトレイトがスコープに入っている必要がある
use rand::Rng; はRngトレイトをスコープに入れる宣言
thread_rng()はrandに定義されている関数
— ちゃまぐ (@tyamaguc07) 2018年12月5日
gen_range() は Rngトレイトに定義されているメソッド
cmp() は比較可能なものに対しならなんでも呼べて、引数に比較したい対象の参照を取る
cmp()は先程 use した Ordering を返す
match文を使って正確に Ordering のどれであるかを判断する
Ordering はenum
Ordering enum は3つのバリアントを持つ。 Less 、 Equal そして Greater。
— ちゃまぐ (@tyamaguc07) 2018年12月5日
バリアント=variant。単語の意味として「わずかに異なるもの」
match 文ではある型の値を取って、それぞれの可能な値に対する「腕」を作れる
Ordering には3種類あるので、3つの腕を作る
Rustには強い静的な型システムがある
— ちゃまぐ (@tyamaguc07) 2018年12月5日
Rustは型推論も持つ
let guess = String::new() と書いた時、guess が文字列である筈だと推論出来るのでわざわざ型を書かなくてもよい
数字の型は色々ある(数値型、32bit数のi32、符号なし32bit数のu32、64bit不動小数点数のf64などなど)
Rustでは以前の guess の定義を新しいもので「隠す」ことが出来る。
— ちゃまぐ (@tyamaguc07) 2018年12月5日
このように隠すことをシャドーイングという。
最初 String であった guess を u32 に変換したい、というような状況でよく使われる
シャドーイングのおかげで 別々の名前を考える必要はなくなり、 guess の名前を再利用出来る
Stringのtrim()メソッドは文字列の最初と最後にある空白を取り除く
— ちゃまぐ (@tyamaguc07) 2018年12月6日
Stringのparse()メソッドは文字列を何かの数値へとパースする、その際にどの型の数値が欲しいのかを伝える必要がある
サンプルでは、let guess: u32で型を伝えている
Rustはエラーの可能性があるのに処理していないことを教えてくれる
— ちゃまぐ (@tyamaguc07) 2018年12月6日
expect()は、エラーがあったらpanic!を呼び出しクラッシュする
parse()はResultを返す
ResultはenumでOkとErrのvariantsを持つ
— ちゃまぐ (@tyamaguc07) 2018年12月6日
Ok(num)と表現するとき、Ok に内包された値を num という名前に設定している
Err(_)と表現するときは、エラーの内容を気にしないので名前ではなく _ を使っている