generated at
RustのModule


moduleの作り方は2つある
mod {..} を使う
これはほぼ使わないっぽい
main.rs
mod my_module { pub fn greet() { println!("Hello from my_module!"); } } fn main() { my_module::greet(); }
ファイルに分割し、 mod でコンパイル対象に含める
my_module.rs
pub fn greet() { println!("Hello from my_module!"); }
main.rs
mod 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 library crateを作ったら、それがcrateになるの、割と特殊だと思うmrsekut
lib.rs作ったら、それがcrate扱いになるので、例えばmainからは( mod 不要で) use でよみこむ



tsとの比較
tsユーザが理解しづらい点
rustでは、moduleの宣言と、itemのスコープへの取り込みが別々に行われる
main.rs
mod hoge; // hoge.rs を読み込んでモジュールとして宣言 use hoge::greet; // hoge モジュール内の greet 関数をスコープに持ち込む fn main() { hoge::greet(); // use書かずにこれでもいい greet(); // useしてれば直接呼び出せる }
main.ts
import { greet } from './hoge'; greet();
tsの場合、自作のファイルも、外部ライブラリも、「module」という同等のものとして使用できる
pathの指定方法はちょっと異なるが、両方とも同じように import で読み込める
import が、modとuseの両方を兼ねている
importされることで、コンパイル対象になり、参照することもできる
Rustの場合、
「〇〇をmoduleに含める」ことと、「〇〇をここで使う」が別の宣言で用意されている
自作ファイルと、外部ライブラリの認識の仕方も異なる
というか、「自作ファイルと外部ライブラリ」という認識の仕方がまず間違っている
「(自作の)module」と「(自作/他作の)crate」という分け方が正しいはず?
Rustのcrateはコンパイル単位、moduleはcrateより細かい単位
自作のmoduleは mod で宣言しコンパイル対象に含め、必要であれば use で名前空間の省略ができる
外部ライブラリの場合、cargo.tomlに書いた時点で、すでにmod宣言がされているような状態になるので、わざわざmodなんちゃらと書かなくてもコンパイル対象になる(?)し、useするだけで読み込める
tsはimportされたものを辿ってコンパイル対象になるが、rsはrootからmod宣言で辿れるものをコンパイル対象に含める
コンパイル対象の話で、useは関係ない



特別扱いされるファイル名



参考