どうも、Masakiです。前回はファイル分割、libを使った単純なファイル分割を紹介しました。今回は更にそこから深くフォルダー分けをしてそれらを呼び出すやり方を紹介したいと思います。
ファイル分割後編
フォルダ構成
前編では「src」の同じ階層内で「module.rs」ファイルを作り呼び出していました。今回はさらにsrcからディレクトリーを作りそこから呼び出す形です。今回のディレクトリーとしてはこんな構造になります。
・ディレクトリー階層
├── Cargo.toml └── src ├── lib.rs ├── main.rs └── module └── hello.rs
各ファイルの中身のコードもとりあえず、前回までと似たように各ファイルに宣言をしていきます。
・lib.rs
pub mod module;
・main.rs
use rust_test::module; // ←プロジェクト名::module; fn main() { }
前回までなら上記のコードだけで動きました。
しかし、今回は更に深い階層にファイルがあるので少し加えるものが必要です。
「mod.rs」の存在
「module」ディレクトリーの中に新しく「mod.rs」というファイルを設置します。
すると、以下のようなディレクトリー構造になるかと思います。
・ディレクトリー階層
├── src │ ├── lib.rs │ ├── main.rs │ └── module │ ├── hello.rs │ └── mod.rs
そして、mod.rsに記述します。
・mod.rs
pub mod hello;
そして、もう一つmain.rsも修正します
・main.rs
use rust_test::module::hello; // ←プロジェクト名::module; fn main() { hello::hello(); }
これで、実行すると表示されます。この「mod.rs」は各ディレクトリーの中から呼び出すときに必ず必要となるファイルです。これは、新しいディレクトリーを作ってそこに「rs」ファイルを置いていたら必ず設置することになります。
更に深く!
ということで、更にmoduleディレクトリーから新しいディレクトリーを作り呼び出すことをやってみます。まずは「new_module」というディレクトリーと「new_hello.rs」「mod.rs」を作ります。すると、このような階層になるかと思います
・ディレクトリー階層
・「module」のmod.rsのコード
├── src │ ├── lib.rs │ ├── main.rs │ └── module │ ├── hello.rs │ ├── mod.rs │ └── new_module │ ├── mod.rs │ └── new_hello.rs
・「new_module」のmod.rsコード
pub fn new_hello(){ println!("new_hello"); }
・new_helloのmod.rsコード
pub mod new_hello;
・moduleのmod.rsの修正コード
pub mod hello; pub mod new_module;
・main.rsコード
use mod_2::module::hello; use mod_2::module::new_module::new_hello; fn main() { hello::hello(); new_hello::new_hello(); }
これで、コンパイルすると「new_hello」も表示されます。
あとがき
どうでしょうか?
今回はmod.rsというものを使い他のファイルから飛び出すことを行いました。
main.rsでは宣言が長くなり、各ファイルに宣言やら設置やら色々と手間が増えてきてしまいますが、各ファイルのコードがスッキリしたと思います。
このようにしていくと長期的に見たときにそのファイルでどのように行われているのか?とかが理解できるのが早くなると思います。
まだまだ小規模の内容ですが、これが一つのプロジェクトで、複数人で行うとなったときに他の人にとっても大きなメリットにもなります。
前編・後編と分けてやりましたが、今回は私なりも、少々気合が入りました!
というわけで次回にまた……