モジュール化

コードが増えてくると、1ファイルの実装では見通しが悪くなってくるため、このタイミングでモジュール化を行います。

 
今回のコード

モジュール概要

モジュールについては The Rust Programming Language 日本語版 の7章にて解説されているため、そちらに沿ってファイルに分割していきます。

階層化のポイント

rustでは ファイルを作って mod 宣言しただけではモジュールにならない ので注意が必要です。特にディレクトリを階層構造にする場合に、整理整頓のためだけのサブディレクトリであっても、rustではモジュールとして扱うため、モジュール宣言をする必要があります。サブディレクトリを含むモジュール宣言にはいくつか方式があります。

方式A) ディレクトリ構造は lib.rs に記載する

階層化の階数やファイル数が多くなると lib.rs の記載量が多くなりますが、作成するファイルが少なくてすむため、今回はこの方式で実装してみます。

src
└── lib.rs
    ├── dir_a
    │   └── module_b.rs
    └── module_c.rs
src/lib.rs
mod dir_a {
    mod module_b;
    pub use module_b::fn_b;
}

mod module_c;

pub use dir_a::fn_b;
pub use module_c::fn_c;

方式B) ディレクトリ名と同名のファイルを作成する

ディレクトリと同名のファイルを作成することで、そのディレクトリの内部にあるモジュールを宣言することができます。

src
└── lib.rs
    ├── dir_a.rs
    ├── dir_a
    │   └── module_b.rs
    └── module_c.rs
src/lib.rs
mod dir_a;
mod module_c;

pub use dir_a::fn_b;
pub use module_c::fn_c;
src/dir_a.rs
mod module_b;

pub use module_b::fn_b;

方式C) mod.rs を作成する

mod.rs をディレクトリ内に作成することで、そのディレクトリにあるモジュールを宣言することができます。

Note: Rust 2018 Editionからは方式Bがスタンダードになりました。この方式はRust 2015 Editionとの後方互換のために残されているようです。

src
└── lib.rs
    ├── dir_a
    │   ├── mod.rs
    │   └── module_b.rs
    └── module_c.rs
src/lib.rs
mod dir_a;
mod module_b;

pub use dir_a::fn_b;
pub use module_c::fn_c;
src/dir_a/mod.rs
mod module_b;

pub use module_b::fn_b;