読者です 読者をやめる 読者になる 読者になる

冥冥乃志

ソフトウェア開発会社でチームマネージャをしているエンジニアの雑記。アウトプットは少なめです。

follow us in feedly

Rustの勉強(その2)

前回の続きです。

mao-instantlife.hatenablog.com

associated functionmethod

前回イメージだけで、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の処理

前項のサンプルにある expectio::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のドキュメント見てね、というやつです。

Cargo and crates.io

以下がビルド時の出力です。ダウンロードしてコンパイルしているのがわかるとおもいます。

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