我阅读了 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)
它将查找用于该模块的文件。
从普通文件中,例如utils.rs,它将查找嵌套文件/目录:
mod models;
Run Code Online (Sandbox Code Playgroud)
frommod.rs或顶级lib.rs或main.rs(它们在这方面很特殊),它将查找同级文件/目录:
./utils/models.rs
./utils/models/mod.rs
Run Code Online (Sandbox Code Playgroud)
从概念上讲,使用mod.rs可以让您像使用文件一样使用目录(index.js如果您熟悉 Javascript,则类似)。
mod.rs文件?有两个不错的选择:
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)
这正慢慢成为首选方法[需要引用],因为它为文件提供了更具描述性的名称。
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上面显示的方法来保持代码的整洁。
最后,这些传递模块不仅仅用于声明其他文件。它们是一个方便的地方:
总的来说,模块系统只是另一个抽象级别,可以使代码得到良好的封装。
从Rust 2018 版本开始,该mod.rs文件是可选的:
在 Rust 2015 中,如果你有一个子模块:
Run Code Online (Sandbox Code Playgroud)// This `mod` declaration looks for the `foo` module in // `foo.rs` or `foo/mod.rs`. mod foo;它可以生活在
foo.rs或foo/mod.rs。如果它有自己的子模块,则它必须是foo/mod.rs. 因此 foo 的 bar 子模块将位于foo/bar.rs.在 Rust 2018 中,带有子模块的模块必须命名的限制
mod.rs被取消。foo.rs可以只是foo.rs,而子模块仍然是foo/bar.rs。这消除了特殊名称,如果您在编辑器中打开了一堆文件,您可以清楚地看到它们的名称,而不是一堆名为 的选项卡mod.rs。
| 归档时间: |
|
| 查看次数: |
7909 次 |
| 最近记录: |