mod
等于module declaration.该指令声明一个模块及其所有内容.碰巧这些内容可能位于另一个文件中.因此:
mod game;
mod matrix;
大致相当于:
mod game {
// game.rs contents
}
mod matrix {
// matrix.rs contents
}
当然,因为mod
是一个模块的声明,所以不能对同一个模块多次声明.也就是说,你可以试着写一些
mod game {
mod matrix;
...
}
mod matrix;
但是,正如您所看到的,matrix
和game::matrix
是不同的模块,当然,如果它们是外部的,rustc需要到各自文件的不同路径.
然而,use
等于import declaration.use
个声明从其他模块中提取名称,以便在当前模块中使用.你可以在任何可以访问该模块的地方多次从中获取任何模块和任何公共项目.
所以,为了从game
中引用matrix
,你需要:
// game.rs
use matrix;
自然地,为了使其发挥作用,matrix
应该在 crate 根中声明为mod
.
作为旁注,我个人认为理解模块系统最简单的方法是首先忘记模块可以放在不同的文件中.也就是说,假设一个 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 .我建议在一些具有复杂模块 struct 的 crate 上运行这个命令,看看它在实践中的效果如何.