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
ちゃんとランダムに生成されていますね。
というわけで
以下次号。