在 Rust Loco 项目中,会看到 models 及 controllers 目录下都有一个 mod.rs 文件。
查了一下,这个 mod 即 module (模块) 的简写。
mod.rs 说明,这个目录下包含一堆子模块。每个子模块的名称就是每个文件的名称。
例如,看看 loco 项目的 controllers 及 models 的代码示例:
目录结构
> tree src/controllers/
src/controllers/
├── auth.rs
├── hello.rs
├── mod.rs
├── notes.rs
└── user.rs
> tree src/models/
src/models/
├── _entities
│ ├── mod.rs
│ ├── notes.rs
│ ├── prelude.rs
│ └── users.rs
├── mod.rs
├── notes.rs
└── users.rs
mod.rs 内容
里面的内容类似,如:
> cat src/controllers/mod.rs
pub mod auth;
pub mod hello;
pub mod notes;
pub mod user;
这里罗列了每个子模块的名称。
这种用法相对 golang 的模块管理要方便多了(也可能我 golang 代码看的少,没找到类似的用法)。 之前在 golang 一个目录下,例如 controllers 下放置一堆子文件,就需要担心不同文件中的 public 函数重名问题。 而 rust 这个机制就完美规避了此问题。
项目根目录下的 lib.rs
在项目根目录下有个与入口文件 app.rs 平级的 lib.rs 文件。 其作用是声明之前定义的模块。
> cat src/lib.rs
pub mod controllers;
pub mod models;
...
这样,就能在 app.rs 中直接使用了。
当然,这些声明可以直接放在 app.rs 中。
app.rs 中使用模块
use crate::{
controllers,
models::_entities::{notes, users},
};
fn routes(_ctx: &AppContext) -> AppRoutes {
AppRoutes::with_default_routes()
.add_route(controllers::notes::routes())
.add_route(controllers::auth::routes())
.add_route(controllers::user::routes())
.add_route(controllers::hello::routes())
}
controllers 中使用 models 中的模块
例如,src/controllers/user.rs 中使用 src/models/user.rs 中的代码, 只需要 use 引入 models 模块即可。
use crate::{models::_entities::users, views::user::CurrentResponse};
注意,这里就不需要再像 lib.rs 中那样去先声明 pub mod models 了。
mod.rs 的更多用法
可以看到,除了在 mod.rs 中写些 pub mod xxx; 的代码。还可以定义一些通用的结构体和方法。
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式