まえがき
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