LoginSignup
3
1

Rustのmodについて

Posted at

まえがき

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内の関数などにアクセスするには以下のようにする

my_mod.rs
fn test() {
	println!("test");
}

pub fn public_test() {
	println!("public test");
}
main.rs
// このように宣言すると、`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を使用することを考える

nested.rs
pub fn util_fn() {
	println!("Utility!");
}
my_mod.rs
mod nested

pub fn test() {
	nested::util_fn();
}

この時、useキーワードを使うとパスを新しい名前にバインドできる

utility.rs
mod nested;
use nested::util_fn;

pub fn test() {
	util_fn();
}

asを使うと完全な別名にバインドすることもできる

utility.rs
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

それぞれのファイルの中身を以下のようにする

utility.rs
pub fn test() {
	println!("test");
}
util.rs
pub mod utility;
main.rs
mod util

fn main() {
	util::utility::test();
}

なにが起こっているのか

通常はディレクトリをまたいでmodすることはできない
しかし、例外的にディレクトリ名.rsからは名前の一致するディレクトリのモジュールにアクセスできる

util.rs内でpub mod utilityとしてutilityモジュールにアクセスする
pub modとすると、読み込んだモジュールがさらに外部からアクセスできる
これを使用して、util.rsで読み込んだutilitymain.rsからアクセスする

つまり以下のような書き方もできる

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

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1