RustのModule
moduleの作り方は2つある
mod {..}
を使う
これはほぼ使わないっぽい
main.rsmod my_module {
pub fn greet() {
println!("Hello from my_module!");
}
}
fn main() {
my_module::greet();
}
ファイルに分割し、 mod
でコンパイル対象に含める
my_module.rspub fn greet() {
println!("Hello from my_module!");
}
main.rsmod my_module; // my_moduleをimport
fn main() {
my_module::greet();
}
structの各メンバは、同一module内からは、pub/pri関係なくアクセス可能
モジュールの宣言とファイルの読み込みを行う
rootファイル以外のmoduleをコンパイル対象に含めるために使う
モジュール内の項目をスコープに持ち込む
名前の参照を簡略化するのみ
モジュール内の特定の項目を利用する際に任意
理解する順序
この辺の用語の違いを抑えておく
module
関数、構造体、トレイト、implブロックなどの要素の集合のこと
crate
lib crate
bin crate
今扱っているものが、どれに相当するのかを理解する
lib.rs作ったら、それがcrate扱いになるので、例えばmainからは( mod
不要で) use
でよみこむ
tsとの比較
tsユーザが理解しづらい点
rustでは、moduleの宣言と、itemのスコープへの取り込みが別々に行われる
main.rsmod hoge; // hoge.rs を読み込んでモジュールとして宣言
use hoge::greet; // hoge モジュール内の greet 関数をスコープに持ち込む
fn main() {
hoge::greet(); // use書かずにこれでもいい
greet(); // useしてれば直接呼び出せる
}
main.tsimport { greet } from './hoge';
greet();
tsの場合、自作のファイルも、外部ライブラリも、「module」という同等のものとして使用できる
pathの指定方法はちょっと異なるが、両方とも同じように import
で読み込める
import
が、modとuseの両方を兼ねている
importされることで、コンパイル対象になり、参照することもできる
Rustの場合、
「〇〇をmoduleに含める」ことと、「〇〇をここで使う」が別の宣言で用意されている
自作ファイルと、外部ライブラリの認識の仕方も異なる
というか、「自作ファイルと外部ライブラリ」という認識の仕方がまず間違っている
「(自作の)module」と「(自作/他作の)crate」という分け方が正しいはず?
自作のmoduleは mod
で宣言しコンパイル対象に含め、必要であれば use
で名前空間の省略ができる
外部ライブラリの場合、cargo.tomlに書いた時点で、すでにmod宣言がされているような状態になるので、わざわざmodなんちゃらと書かなくてもコンパイル対象になる(?)し、useするだけで読み込める
tsはimportされたものを辿ってコンパイル対象になるが、rsはrootからmod宣言で辿れるものをコンパイル対象に含める
コンパイル対象の話で、useは関係ない
特別扱いされるファイル名
参考