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:これも詳細は後ほどとあった