- 前の記事: master mind by rust; part 5 単体テスト - Sabrou-mal サブロウ丸
- 次の記事: master mind by rust; part 7 HashMapとそれを用いたmin max policyの追加 - Sabrou-mal サブロウ丸
今回やること
- ファイル分割
モジュール化
Rust では、モジュールを使ってプログラムを構造化することができます。モジュールは、関連する関数、構造体、トレイト、型などをグループ化するための仕組みです。 また、今まではmain.rsのみでプログラムを書いていましたが、モジュールを使うことで、複数のファイルに分割することができます。
現在のフォルダ構成
. ├── Cargo.lock ├── Cargo.toml └── src └── main.rs
まずは、srcフォルダに機能ごとに新しいファイルを作成します。
. ├── Cargo.toml └── src ├── def.rs ├── main.rs ├── policy.rs └── utils.rs
例えば、def.rsの中身は以下のようにしました。
def.rsファイルを作成することでdefモジュールが作成されます。
このモジュールの中身をmain.rsやその他のモジュールから利用するためにpub
をつけて公開します。
pub type Code = Vec<usize>; pub type CodeSet = Vec<Code>; pub type Hint = (usize, usize); #[derive(Debug)] pub struct Context { pub color_num: usize, pub pin_num: usize, pub duplicate: bool, }
次にpolicy.rsの中身は以下のようにしました。crate::defと書くことで、defモジュールの中身を利用することができます。crateとは、プログラムのルートモジュールを指すキーワードです。
use crate::def;
によってdef::CodeSetを使うことができます。use crate::def::CodeSet
とすると単にCodeSetと書くことができます。- useをかかなかった場合でも、
crate::def::CodeSet
と書けば良いです。
use crate::def; // select guess from guess set pub fn first_pick(guess_set: &def::CodeSet) -> def::Code { guess_set[0].clone() }
最も重要なことはmain.rsで次のようにmodを使ってモジュールを読み込むことです。これによりrootモジュールにdef, utils, policyモジュールが追加されます。
mod def; mod utils; mod policy;