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

文章目录

    在 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式