Rustのファイル分割方法


1. はじめに

ファイル分割ができると、ファイル管理がしやすくなります。今までは Rust で何回も cargo new をして分けていましたが、さすがに容量を考えると大量に行うのは非効率でした。

サンプルコードは下記 URL にあります。
file_split URL:
https://github.com/DiaSird/files_split

2. プロジェクトの作成

今回は Hello World!を例にファイル分割を行います。
まず、cargo new で新規プロジェクトを作ります。

$ cargo new files_split

ここで、main プログラムにある出力形式(println!())を関数 hello();に書き換えておきましょう。

// main.rs
fn main() {
    // Hello, world!
    say_hello();
}

3. モジュールで整理する

次に、src フォルダに lib.rs と module フォルダを作成します。下のように、lib.rs で module の宣言を行います。

// lib.rs
// pub mod <directory name>
pub mod module;

続いて module フォルダ内の操作に移ります。

module フォルダでは、最初に mod.rs を作成します。
mod.rs 内では下記のように、モジュールとクレート(モジュールツリー)の宣言を行います。

// mod.rs
// pub mod <module file name>
pub mod hello;
// pub use crate::<module name>::<module file name>
pub use crate::module::hello::say_hello;

module フォルダの中での module は、次に作成する hello.rs に該当します。

hello.rs を作成し、下のように say_hello 関数を作成しましょう。pub は public の略称で、rust はデフォルトの状態が外部から呼び出せない private な関数となっています。

// hello.rs
pub fn say_hello() {
    println!("Hello, world!");
}

4. 実行

最後に src/main.rs に戻り、ワイルドカード * 形式でファイル(複数あればファイル群)にある関数を呼び出します。その中継役は lib.rs が担っています。

main.rs の変更:

// main.rs
// use <project name>::<module name>
use files_split::module::*;

fn main() {
    // Hello, world!
    say_hello();
}

以上でファイル分割は完成です。サンプルコードでは module フォルダ内で hello2.rs を追加していますが、main 関数で say_hello2();をコメントアウトすれば自由に出力形式が変えられます。

実行:

$ cargo run

実行結果:

Hello, world!

参考資料

Rust をやってみる(ファイル分割)