是否可以避免使用“mod.rs”文件?

Dol*_*hin 13 rust

我阅读了 mod 文档,发现我必须mod.rs在每个文件夹中添加,例如我必须在我的项目结构中定义这样的 mod:

src/
  models/
    login.rs
    mod.rs
  routes/
    login_route.rs
    mod.rs
  services/
    login_service.rs
    mod.rs
  main.rs
Run Code Online (Sandbox Code Playgroud)

并像这样使用它main.rs

mod models;
mod routes;
mod services;
Run Code Online (Sandbox Code Playgroud)

为什么要这样做呢?为什么要这样设计?如果项目增加,项目中有很多mod.rs文件只是为了暴露mod?这是一个好的做法吗?我不明白。这样做有什么好处呢?如果我们这样做:

crate::models::login;
Run Code Online (Sandbox Code Playgroud)

它是如此清晰易懂。

kmd*_*eko 21

mod.rs 文件的用途是什么?中对此进行了部分解释。

本质上,Rust 不会对文件结构做出任何假设,并且不会.rs在开发人员未声明的情况下考虑其他文件。相反,他们的目的是使用模块系统在其代码中构建组织结构。

虽然这与其他一些语言不同,但这为开发人员提供了更多控制权。由于导入路径与文件结构解耦,因此您的模块、结构、函数等可以根据需要重新组织和重新导出。这还允许您准确声明编译的内容,这有助于条件编译

那么 Rust 什么时候使用文件结构呢?当您声明没有主体的模块时:

mod models;
Run Code Online (Sandbox Code Playgroud)

它将查找用于该模块的文件。

从概念上讲,使用mod.rs可以让您像使用文件一样使用目录(index.js如果您熟悉 Javascript,则类似)。


有没有办法避免所有这些mod.rs文件?

有两个不错的选择:

  1. 使用models.rs而不是models/mod.rs

    只需将mod.rs文件上移一级并重命名以匹配其目录即可。您不必修改任何文件的内容。main.rs您的结构可能如下所示:

    src/
      models/
        login.rs
      routes/
        login_route.rs
      services/
        login_service.rs
      main.rs
      models.rs
      routes.rs
      services.rs
    
    Run Code Online (Sandbox Code Playgroud)

    这正慢慢成为首选方法[需要引用],因为它为文件提供了更具描述性的名称。

  2. 只需在以下位置声明您的模块结构main.rs

    这有点不合常规,但嵌套模块声明会找到嵌套文件。你不需要mod.rs任何地方:

    src/
      models/
        login.rs
      routes/
        login_route.rs
      services/
        login_service.rs
      main.rs
    
    Run Code Online (Sandbox Code Playgroud)

    如果你像这样声明你的模块main.rs

    mod models {
        mod login; // this will use ./models/login.rs
    }
    mod routes {
        mod login_route; // this will use ./routes/login_route.rs
    }
    mod services {
        mod login_service; // this will use ./services/login_service.rs
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这个不是特别推荐。它可能在小型项目中工作得很好,但随着代码库变大,它会变得笨拙。您可能需要使用mod.rs上面显示的方法来保持代码的整洁。


最后,这些传递模块不仅仅用于声明其他文件。它们是一个方便的地方:

  • 将共享代码放在其子模块中
  • 包括有关如何设计和/或使用其所包含的结构、特征等的文档
  • 重新导出深度嵌套的项目,以便代码的其余部分更容易访问它们

总的来说,模块系统只是另一个抽象级别,可以使代码得到良好的封装。

  • 我在一些项目中看到过选项 1,我认为这是一个错误。我不明白 models.rs 比 models/mod.rs 更具描述性。如果有什么不同的话,那就是它的描述性较差,而且很令人困惑,因为在您找到该文件夹​​之前,不清楚该文件为何存在。对于文件夹来说,封装自己的模块设置更有意义,而不是用一堆被令人困惑地截断的分散的重复项弄乱顶层。 (5认同)

Sve*_*rev 6

Rust 2018 版本开始,该mod.rs文件是可选的:

在 Rust 2015 中,如果你有一个子模块:

// This `mod` declaration looks for the `foo` module in
// `foo.rs` or `foo/mod.rs`.
mod foo;
Run Code Online (Sandbox Code Playgroud)

它可以生活在foo.rsfoo/mod.rs。如果它有自己的子模块,则它必须是foo/mod.rs. 因此 foo 的 bar 子模块将位于foo/bar.rs.

在 Rust 2018 中,带有子模块的模块必须命名的限制mod.rs被取消。foo.rs可以只是foo.rs,而子模块仍然是foo/bar.rs。这消除了特殊名称,如果您在编辑器中打开了一堆文件,您可以清楚地看到它们的名称,而不是一堆名为 的选项卡mod.rs

其他资源: