Rustにおけるファイル分割
クレートのきほん
その各要素(関数, 構造体など)に対してモジュール外部へ公開するか否かが設定できる。(pub) code:A.rs
mod a1 {}
mod a2 {}
/*
A
┣━ a1
┗━ a2
*/
ファイル外部のモジュールはmod A;として宣言すれば、そこにモジュールAの定義を持って来れる。 サブフォルダとモジュール
一つのサブフォルダSは新たなモジュールとみなされる。
ただし、Sがサブフォルダと見なされるためには、そのフォルダと同名のrsファイルS.rsが必要
ここで、Sフォルダ内に入っている複数のファイル(モジュール)のうち、どれをどのように外部へ公開するかを定める。
以下、src/SのことをSと呼ぶことにしよう。
code:tree
src
|-- main.rs
|-- S.rs
|-- S
| |-- a1.rs
| |-- a2.rs
サブフォルダ内でa1.rs, a2.rsにあった時
S.rsが次の中身だったとき
code:S.rs
pub mod a1;
pub mod a2;
src/main.rsからは、次の形でこれらのモジュールにアクセスできるようになる
code:rs
mod S;
use S::{a1, a2};
pubを外せばアクセスできなくなる。
WJ.icon これはどういう仕組みなのだろう...なぜS.rsはフォルダSの中身が見えているのだろう...?appbird.icon
基本あるファイルから見えるモジュールはそれと兄弟のディレクトリ位置にあるファイル(モジュール)だけ
特別扱いされている?
ちょっと待って!a1の中のfuncだけを呼び出したいんだけど、use S::a1::funcってしなきゃいけないってコト!?
そうでもないappbird.icon S.rs内部でa1::funcをuseしておけば、呼び出しを縮約できる。
code:S.rs
mod a1;
pub use a1::func;
// 全てのa1内の関数を使いたければ、 pub use a1::*
code:main.rs
mod S;
use a1::func;
そすれば
crateで表される
現在のモジュールに対して、相対パスが使える。
superで親モジュールから始められる。
モジュールをuse(現モジュールへ名前を導入する)こともできる。 use std::io; (ioという名前/モジュールをクレート内で使用することができる) 実際に使いたいものの親モジュールをuseしておくことで、名前の衝突を防ぐことができる。 例
Resultはuse std::fmt::Result と use std::io::Result で衝突する可能性がある。
use std::fmt と use std::ioにまで留めておけば、衝突を回避できる。
Resultはfmt::Result, io::Resultと区別して使用する。
globパターンを用いることも。
こんな記法あったっけ(うろ覚え)