まえがき
Rustを使う中でmodが良くわからなかったのでまとめる
間違い、不正確な点等あれば修正してください
mod
モジュールは関数、構造体、トレイト、
implブロック、さらには他のモジュールなどの要素の集合です。
モジュール - Rust By Example 日本語版]
modキーワードを使ってモジュールを宣言できる
pubキーワードを使うと外部のスコープからもアクセスできる
mod example_mod {
fn test() {
println!("test");
}
pub fn public_test() {
println!("public test");
}
}
ファイルを分ける
.
├── main.rs
└── my_mod.rs
以上のような構成があったとする
この時、main.rsからmy_mod.rs内の関数などにアクセスするには以下のようにする
fn test() {
println!("test");
}
pub fn public_test() {
println!("public test");
}
// このように宣言すると、`my_mod`という名前のファイルを探す
// また、`my_mod`という名前で中身にアクセスできる
mod my_mod
fn main() {
// このようにアクセスできる
my_mod::public_test();
// もちろん公開していない関数等にはアクセスできない
// my_mod::test();
}
use
以下のディレクトリ構成を仮定する
.
├── utils
├── utility.rs
├── nested.rs
├── main.rs
└── my_mod.rs
utility.rsからnestedを使用することを考える
pub fn util_fn() {
println!("Utility!");
}
mod nested
pub fn test() {
nested::util_fn();
}
この時、useキーワードを使うとパスを新しい名前にバインドできる
mod nested;
use nested::util_fn;
pub fn test() {
util_fn();
}
asを使うと完全な別名にバインドすることもできる
mod nested;
use nested::util_fn as util;
pub fn test() {
util();
}
ディレクトリをまたぐ / pub mod
以下のディレクトリ構成を仮定する
.
├── utils
├── utility.rs
├── main.rs
ここで、main.rsからutility.rsのモジュールを使いたい場合を仮定する
この時、main.rsから直接mod utilityすることはできない
代わりに、ディレクトリ名.rsを作成して経由してやる必要がある
.
├── utils
├── utility.rs
├── main.rs
├── utils.rs
それぞれのファイルの中身を以下のようにする
pub fn test() {
println!("test");
}
pub mod utility;
mod util
fn main() {
util::utility::test();
}
なにが起こっているのか
通常はディレクトリをまたいでmodすることはできない
しかし、例外的にディレクトリ名.rsからは名前の一致するディレクトリのモジュールにアクセスできる
util.rs内でpub mod utilityとしてutilityモジュールにアクセスする
pub modとすると、読み込んだモジュールがさらに外部からアクセスできる
これを使用して、util.rsで読み込んだutilityにmain.rsからアクセスする
つまり以下のような書き方もできる
mod util;
use util::utility::test
fn main() {
test();
}
mod.rsてのもあるんだけど...?
mod.rsをディレクトリに配置せよという文献も散見される
# Rustのライブラリ管理は「mod.rs」が大事(Rust 2015)
しかしこれはRust2015の機能であり、現在は後方互換のためだけに残っているものと思われる
現在は基本的に使わなくて良さそう
参考文献
モジュール - Rust By Example 日本語版
[Rust] モジュールのベストプラクティス
Rustでのモジュール分割について #Rust - Qiita