Rust 模块分文件

初试 Rust 时,对它的 mod 机制很蒙蔽,特别是习惯了 Go 的包机制后。
其实站在编译器的角度来思考就清晰多了。
Rust 编译器只接受 【一个】 .rs文件作为输入,并且只生成一个crate。
所以在 src/main.rs 中,我们使用 mod video; 告诉编译器去在当前位置查找 video.rs./video/mod.rs

如,以下目录结构:

$ tree -L 3 src
src
├── main.rs
└── video
    ├── file.rs
    ├── mod.rs
    └── worker.rs

在此项目中 main.rs 作为入口文件,然后在 main.rs 中定义 video 模块:

/// src/main.rs
mod video;

fn main() {
    video::do_work();
}

于是编译器找到 video/mod.rs 文件:


// 将此mod下的 worker mod (文件:video/worker.rs) 中的 say()函数 发布到与当前同级别的空间(外部可以 video::say() 的方式调用)
pub use self::worker::say; 

// 告诉编译器去当前目录下找 `file.rs` 或 `file/mod.rs`
pub mod file;

pub mod worker;

pub fn do_work() {
    let files = file::all_files();
    for f in files.iter() {
        println!("得到文件:{}", f.file_name().to_str().unwrap());
        worker::dowork(f);
    }
}