mod
是模块声明。这个指令声明了一个模块及其所有内容。恰好这些内容可能位于另一个文件中。因此,它看起来像这样:
mod game;
mod matrix;
大致上等同于这个:
mod game {
}
mod matrix {
}
自然地,由于 mod
是模块声明,因此您不能为同一个模块多次重复声明。也就是说,您可以尝试编写类似以下的代码:
mod game {
mod matrix;
...
}
mod matrix;
但是,正如您所看到的,matrix
和 game::matrix
是不同的模块,因此 rustc 需要不同的路径来访问它们各自的文件(如果它们是外部模块)。
use
是一种导入声明。 use
声明从其他模块中提取名称以在当前模块中使用。您可以从任何地方多次使用任何模块和其中的公共项,只要该模块可访问即可。
因此,为了引用game
中的matrix
,您需要use
它:
// game.rs
use matrix
自然而然,为了使这个工作正常,应该在crate根目录中使用mod
声明matrix
。
另外,我个人认为理解Rust模块系统的最简单方法是先忘记模块可以放在不同的文件中。也就是说,将一个crate仅定义在单个文件中。在Rust中,mod
指令可以有主体并可以嵌套,因此嵌套的mod
实际上定义了crate的模块系统:
mod foo {
mod bax {
...
}
mod baz {
...
}
}
mod bar {
mod qux {
mod zux {
...
}
}
}
如果您只有一个单独的文件,您可以轻松地了解mod
和use
指令的工作原理,并且模块之间的关系应该变得清晰明了。
现在您只需要补充一点,即如果模块声明时没有主体,例如mod name;
,那么它的内容将从name.rs
或者name/mod.rs
中加载,以任何一个可用的为准。然而,整个情况没有改变—这些仍然是嵌套模块,可以始终表示为带有嵌套mod
指令的单个源文件。事实上,cargo rustc -Z unstable-options --pretty=normal
将在外部源文件的所有模块被组装成单个文档后以此形式打印您的crate。我建议您在一些具有复杂模块结构的crate上运行此命令,以查看实际效果。