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!())を関数 say_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 に戻り、ワイルドカード * 形式でファイル(or ファイル群)にある関数を呼び出します。中継役は 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();をコメントアウトすれば自由に出力形式が切り替えられます。
この記事の応用例として、構造体ではimplを複数ファイルに分離して書けることから、各ファイルでパスを通せば大規模なプログラムも作成可能です。
実行:
$ cargo run
実行結果:
Hello, world!
参考資料
Rust をやってみる(ファイル分割)
- 前編
https://www.wow-creators.com/programming/rust%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%88%86%E5%89%B2/ - 後編
https://www.wow-creators.com/programming/rust%e3%82%92%e3%82%84%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e5%88%86%e5%89%b2-%e5%be%8c%e7%b7%a8/