Rustの勉強(その2)
前回の続きです。
mao-instantlife.hatenablog.com
associated function と method
前回イメージだけで、associated functionはJavaで言うところの静的メソッドと言ってたんですが、公式の説明の仕方も同じだったのであっていたようです。インスタンスメソッドに相当するのは単に method と呼ぶ模様。呼び出しについては :: を使っているか . を使っているかで分かる仕組みになっています。
io::stdin().read_line(&mut guess) .expect("Failed to read line");
io::stdin() は associated function で、read_line(&mut guess) は method の呼び出しです。
引数の渡し方
references という機能 *1 があって、一つのデータに対して複数の参照が持てたり、並列してコピーができたりするみたいです。
let out guess = String::new();
参照渡しは & をつけるみたいですね。デフォルトは値渡しなんでしょうか?参照渡しの場合でも、渡された参照はデフォルトでイミュータブルなものとして挙動するようです。 read_line のような変数内の値を変更しなければならない(いわゆる副作用のある)メソッドに渡す場合は、ミュータブルな参照渡しをするために &mut guess と書いて渡します。定義面はまだたどり着いていないので、書き方がどう変わるかはまだわかりません。
IOの処理
前項のサンプルにある expect は io::Result のメソッドで、IOの結果に伴う処理をするためのクラスです。Resultだけ受け取って処理を書かないと警告が出ます。以下はexpectを書かずにビルドした時のメッセージです。
src/main.rs:10:5: 10:39 warning: unused result which must be used, #[warn(unused_must_use)] on by default
src/main.rs:10 io::stdin().read_line(&mut guess);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
プレイスホルダー
println!(“You guessed {}”, guess};
プレイスホルダーは {} で、複数指定可能です。
let x = 1; let y = 3; println!(“x and y: {} and {} “, x, y);
Cargoを使ってライブラリの依存関係を追加する
cargo.tomlに以下を追加します。
[dependencies] rand=“0.3.0"
この状態でビルドすると、Cargoで依存関係を解決します。バージョン表記は省略形とする場合は ^0.3.0 、固定の場合は =0.3.0 、バージョン指定なしの最新を取得する場合は * と表記する。まあ、当然ですが、詳しくはCargoのドキュメント見てね、というやつです。
以下がビルド時の出力です。ダウンロードしてコンパイルしているのがわかるとおもいます。
Running "cargo build":
Updating registry `https://github.com/rust-lang/crates.io-index`
Downloading advapi32-sys v0.1.2
Downloading libc v0.2.7
Downloading rand v0.3.13
Compiling libc v0.2.7
Compiling winapi-build v0.1.1
Compiling winapi v0.2.5
Compiling advapi32-sys v0.1.2
Compiling rand v0.3.13
Compiling guessing_game v0.1.0 (file:///Users/mao/Documents/RustWorkspace/guessing_game)
"cargo build" completed with code 0
It took approximately 16.946 seconds
これだけ?
とりあえず今日はここまで。以下次号。
*1:これも詳細は後ほどとあった