冥冥乃志

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

follow us in feedly

Rustの勉強(その3)

というわけで前回の続き。チュートリアルがエコシステムのざっくり説明になってるので、RustというよりもCargoの勉強中。

mao-instantlife.hatenablog.com

Cargoの依存ライブラリバージョン管理

前回、以下のように指定しています。

rand="0.3.0"

rand=“=0.3.0” ではないので指定後初回のビルドコマンド実行では、0.3.0から0.4.0未満のバージョンを取得しますが、ライブラリにマイナーバージョンのアップデート *1 があった場合、ビルドコマンドは自動でライブラリを取得しません。これはレグレッションによるバグを防ぐための Cargo.lock ファイルがビルド時に生成されるからで、Cargo.lock 内でマイナーバージョンまで合わせて指定されています ((バイナリの場合は Cargo.lock も合わせてバージョン管理にコミットするように推奨しているのは、おそらくこのため)) 。 Cargo.toml が変更されない限り、Cargoはこの指定を優先します。

Cargo.toml を更新するには、 cargo update コマンドを使います。

Running "cargo update":
    Updating registry `https://github.com/rust-lang/crates.io-index`
    Removing advapi32-sys v0.1.2
    Updating rand v0.3.13 -> v0.3.14
    Removing winapi v0.2.5
    Removing winapi-build v0.1.1

"cargo update" completed with code 0
It took approximately 8.086 seconds

都合よくというかなんというか。前回ビルドを実行した時からrandがマイナーバージョンアップしたので、ライブラリが更新されました。なお、0.3.x系から0.4.x系にバージョンアップした時などは Cargo.toml を直接編集する必要があります。

Rustソース内での外部依存ライブラリの読み込み

Cargoの dependencies セクションに追加した依存ライブラリをRustソース内で利用するためには以下の宣言が必要です(useで使う前に)。

extern crate rand;

crateって「木枠」という意味の単語だったんですね。「c rate」かと思ってました。。。外部ライブラリのrandをこのソース内で利用します、という意味ですね。これをつけることで、ソース内で rand:: でライブラリの機能にアクセス可能になります。

Traitという名前の機能の挙動がScalaと違う気がする

rand の機能を使う際に以下の宣言が必要でした。

use rand::Rng;

Traitと名付けられているようで、 メソッドはTraitと呼ばれる何かに定義されていて、メソッドを機能させるにはスコープにTraitが必要 と説明されていますが、いつものごとく「詳細は後でね♪」という感じです。とにかく今はこれが必要だと覚えておけばいいようです。ちなみに、RngはRandom Number Generatorの略っぽい。

で、この宣言をしておくと以下のようにランダム値の生成が可能です。

let secret_number = rand::thread_rng().gen_range(1, 101);

println!("Secret number is: {}", secret_number);

ローカルスレッドで動くジェネレータを取得して1〜100までのランダム値を生成します *2 。前回に対して変更したソースを実行してみます。

mao guessing_game $ cargo run
     Running `target/debug/guessing_game`
Guess the number!
Secret number is: 26
Please input your guess.
26
You guessed: 26

mao guessing_game $ cargo run
     Running `target/debug/guessing_game`
Guess the number!
Secret number is: 66
Please input your guess.
66

You guessed: 66

ちゃんとランダムに生成されていますね。

というわけで

以下次号。

*1:バグフィックスが入った時など

*2:上限値は除外する仕様