mod.rs
文件,但不知道其具体用途。我找不到相关文档,并在其他许多 Rust 项目中也看到了这种情况。
mod.rs 文件的作用是什么?何时应该使用它?mod.rs
文件,但不知道其具体用途。我找不到相关文档,并在其他许多 Rust 项目中也看到了这种情况。
mod.rs 文件的作用是什么?何时应该使用它?想象以下目录结构:
code/ `- main.rs - something/ `- mod.rs
如果在main.rs
中输入mod something;
,则它将查找something/mod.rs
文件作为something
模块声明的内容。
另一种方法是在code/
目录下有一个名为something.rs
的文件。
因此,总结一下,当您编写空的模块声明(例如mod something;
)时,它会查找:
something.rs
的文件mod.rs
的文件夹中名为something
的文件夹中的文件然后使用这些文件之一的内容作为模块声明的内容。
src
utils
bar.rs
foo.rs
main.rs
src/utils/foo.rs
和 src/utils/bar.rs
的存在。src/utils/
。如上所示,你有两个选项:
src/utils/mod.rs
src/utils.rs
(与文件夹同名,不带扩展名)utils
的模块已经可用。src/utils/foo.rs
和 src/utils/bar.rs
。utils
模块必须声明两个以这些文件命名的子模块。
因此,src/utils/mod.rs
(或 src/utils.rs
)的内容应为:pub mod bar;
pub mod foo;
mod utils;
use utils::{foo, bar};
选项1 • mod.rs
(旧的方式):
src
utils
bar.rs
foo.rs
mod.rs
main.rs
<folder_name>.rs
(首选方式):src
utils
bar.rs
foo.rs
utils.rs
main.rs
这只是一个表面的解释,你的下一个目的地是官方文档。
有一种第三种声明模块的方式(核心语言):
mod utils {
// module code goes here. That's right, inside of the file.
}
mod utils;
。
在这种情况下,如上所示,Rust会搜索src/utils.rs
或src/utils/mod.rs
。src/main.rs
中)时,
你可以通过以下方式引用它:
src/main.rs
mod module { ... }
src/main.rs
mod module { pub mod sub_module { ... } }
src/*.rs
mod.rs
文件:src/*/mod.rs
// src/main.rs
mod utils {
pub mod foo;
}
重要说明:
例如,同时拥有src/utils.rs
和src/utils/mod.rs
将在编译时引发以下错误:
error[E0761]: file for module `utils` found at both "src/utils.rs" and "src/utils/mod.rs"
--> src/main.rs:1:1
|
1 | mod utils;
| ^^^^^^^^^^
|
= help: delete or rename one of them to remove the ambiguity
mod utils;
将模块引入范围,然后使用use utils::{foo, bar};
。 - Romain Vincent除了lib.rs和main.rs总是匹配crate模块,每个rs文件都会有自己的模块。
声明模块的方法只有一种:
/* pub */ mod sub_module1;
一个模块不能在根/包模块树之外声明(即,向上遍历模块树,子模块必须始终具有直接在 lib.rs
或 main.rs
中声明的父模块,因此第一个程序子模块必须始终在那里声明 - 如果这还不够明显,就像一棵树形数据结构)。
有两种方法可以将模块嵌套在其声明所在的模块中:
<module_where_it_is_declared>/<module_name.rs>
中<module_where_it_is_declared>/module_name/mod.rs
中如果 module_where_it_is_declared
是包模块,则不需要相应的子文件夹(从上面的方案中消失)。
以下是适用于 lib 和 binary crates 的示例:
src
|---lib.rs ( contains: pub mod b2; )
|---b2.rs ( contains: pub mod bb2; )
|---b2
| |---bb2.rs
. .
另外:
src
|---lib.rs ( contains: pub mod b2; )
|---b2
| |---mod.rs ( contains: pub mod bb2; )
| |---bb2.rs
. .
您可以看到,您可以混合使用(b2使用mod.rs
方式,bb2使用“文件”方式)。
以下是仅使用文件模式的有效方法:
src
|---lib.rs ( contains: pub mod b2; )
|---b2.rs ( contains: pub mod bb2; )
|---b2
| |---bb2.rs (contains: pub mod bbb2; )
| |---bbb2.rs (contains: pub mod bbbb2; )
| |---bbb2
| | |---bbbb2.rs
. . .
我想这取决于您如何嵌套模块。
对于仅导出其他子模块并且没有其他(或非常少)代码的模块,我喜欢使用mod.rs
语法,尽管您可以在mod.rs
中放置任何内容。
我使用mod.rs
类似于JS/TS世界中的桶模式,将几个子模块卷起来成为一个单独的父模块。
此外,请不要忘记模块可以通过添加作用域块进行内联定义(而不仅仅是声明):
pub mod my_submodule {
// ...
}
mod.rs
吗,还是这是内置的? - Liam Marshall#[path = "thefile.rs"]
属性指定任何路径,但通常不建议这样做,因为惯例是我在答案中指定的。请参阅参考文献。 - Jorge Israel Peñasomething.rs
和something/mod.rs
?mod.rs
,这不是很奇怪吗?这样会让搜索变得非常糟糕。