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