Shesh‘s blog的那篇Clear explanation of Rust’s module system写的太好了。
详见http://www.sheshbabu.com/posts/rust-module-system/
为加深理解,实际操作一下,直接做成最终版本项目结构:
1 执行 cargo new my_project 然后在生成的src目录中新建目录routes和models
2 在src目录下已有main.rs ,再新建文件 config.rs
在routes目录下新建文件mod.rs
health_route.rs 和
user_route.rs
在models目录下新建文件
mod.rs 和
user_model.rs
上述7个文件源码如下:
// main.rs mod config; mod routes; mod models; fn main() { routes::health_route::print_health_route(); routes::user_route::print_user_route(); config::print_config(); println!("main"); }
// config.rs pub fn print_config() { println!("config"); }
routes目录下的
// routes/mod.rs pub mod health_route; pub mod user_route;
// routes/health_route.rs pub fn print_health_route() { println!("health_route"); }
// routes/user_route.rs pub fn print_user_route() { crate::models::user_model::print_user_model(); println!("user_route"); }
models目录下的
// models/mod.rs pub mod user_model;
// models/user_model.rs pub fn print_user_model() { println!("user_model"); }
cargo run ,可正常运行
我对原文的理解:
1 我们看到的是文件目录树(File System Tree),而编译器看到的是模块系统树(Module System Tree),两者并不对应。
例如:main.rs中有mod config,编译器就会在同级目录中找config.rs文件或config目录
2 子模块是由父级声明的,不是用自身文件名或目录名声明的。
例如:main.rs中用mod routes声明,编译器就会在同级目录中找routes.rs文件或routes目录
3 子模块函数要加 pub 关键字,才能被调用。子模块目录中的mod.rs中也要加pub关键字
例如:main.rs中用mod routes声明后,routes目录下的mod.rs中又用pub mod user_route 声明 ;在user_route.rs中又用pub关键字暴露print_user_route函数,
然后才能在main.rs中调用routes::user_route::print_user_route();
4 config routes models 三个子模块都是项目Crate的直接子模块,例如:可在main.rs中用绝对路径进行调用的代码:
crate::models::user_model::print_user_model();
还可用super use 关键字,不详述。
5 在Cargo.toml中添加外部依赖后,外部模块就全局可用了,不需要用mod关键字声明了。
6 最外层是Package,其中有一个Cargo.toml
默认的项目的 `binary crate` 的入口文件是 src/main.rs
默认的库 `library crate` 的入口文件是 src/lib.rs 库名称与Package的名称相同。
Module 在一个crate内,将代码进行分组。
参考:https://www.cnblogs.com/ishenghuo/p/13539547.html
https://www.jianshu.com/p/b58489afc616