RustのModule
moduleの作り方は2つある
mod {..}を使う
これはほぼ使わないっぽい
code:main.rs
mod my_module {
pub fn greet() {
println!("Hello from my_module!");
}
}
fn main() {
my_module::greet();
}
ファイルに分割し、modでコンパイル対象に含める
code:my_module.rs
pub fn greet() {
println!("Hello from my_module!");
}
code:main.rs
mod my_module; // my_moduleをimport
fn main() {
my_module::greet();
}
/mrsekut-book-4297105594/274 (6-12 モジュールとアイテムの可視性)
#WIP
/mrsekut-book-4873118557/182 (8章 クレートとモジュール)
https://techracho.bpsinc.jp/yoshi/2022_08_29/121213
structの各メンバは、同一module内からは、pub/pri関係なくアクセス可能
Rustのmod
モジュールの宣言とファイルの読み込みを行う
rootファイル以外のmoduleをコンパイル対象に含めるために使う
Rustのuse
モジュール内の項目をスコープに持ち込む
名前の参照を簡略化するのみ
モジュール内の特定の項目を利用する際に任意
理解する順序
この辺の用語の違いを抑えておく
module
関数、構造体、トレイト、implブロックなどの要素の集合のこと
crate
lib crate
bin crate
今扱っているものが、どれに相当するのかを理解する
lib.rsでlibrary crateを作ったら、それがcrateになるの、割と特殊だと思うmrsekut.icon
/mrsekut-book-4297105594/429
lib.rs作ったら、それがcrate扱いになるので、例えばmainからは(mod不要で)useでよみこむ
https://zenn.dev/newgyu/articles/3b4677b4086768
tsとの比較
tsユーザが理解しづらい点
rustでは、moduleの宣言と、itemのスコープへの取り込みが別々に行われる
code:main.rs
mod hoge; // hoge.rs を読み込んでモジュールとして宣言
use hoge::greet; // hoge モジュール内の greet 関数をスコープに持ち込む
fn main() {
hoge::greet(); // use書かずにこれでもいい
greet(); // useしてれば直接呼び出せる
}
code:main.ts
import { greet } from './hoge';
greet();
tsの場合、自作のファイルも、外部ライブラリも、「module」という同等のものとして使用できる
pathの指定方法はちょっと異なるが、両方とも同じようにimportで読み込める
importが、modとuseの両方を兼ねている
importされることで、コンパイル対象になり、参照することもできる
Rustの場合、
「〇〇をmoduleに含める」ことと、「〇〇をここで使う」が別の宣言で用意されている
自作ファイルと、外部ライブラリの認識の仕方も異なる
というか、「自作ファイルと外部ライブラリ」という認識の仕方がまず間違っている
「(自作の)module」と「(自作/他作の)crate」という分け方が正しいはず?
rustの場合は、crateとmoduleは異なる概念
Rustのcrateはコンパイル単位、moduleはcrateより細かい単位
自作のmoduleはmodで宣言しコンパイル対象に含め、必要であればuseで名前空間の省略ができる
外部ライブラリの場合、cargo.tomlに書いた時点で、すでにmod宣言がされているような状態になるので、わざわざmodなんちゃらと書かなくてもコンパイル対象になる(?)し、useするだけで読み込める
tsはimportされたものを辿ってコンパイル対象になるが、rsはrootからmod宣言で辿れるものをコンパイル対象に含める
コンパイル対象の話で、useは関係ない
特別扱いされるファイル名
main.rs
lib.rs
❌️mod.rs
参考
Document
Rustのモジュールの使い方 | κeenのHappy Hacκing Blog
Rust のモジュールシステム - Qiita
https://qnighy.hatenablog.com/entry/2019/05/06/190000