rust 项目中 mod.rs 文件的作用

更新日期: 2024-05-06 阅读次数: 383 字数: 491 分类: rust

在 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 的更多用法

rust mod.rs

可以看到,除了在 mod.rs 中写些 pub mod xxx; 的代码。还可以定义一些通用的结构体和方法。

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式