我想将Rust程序拆分为多个文件,但使用mod
并不允许我从main.rs
以外的文件引用同一目录中的文件。
例如,如果我在同一个文件夹中有main.rs
,game.rs
和matrix.rs
,我可以从game.rs
或matrix.rs
引用结构/函数在main.rs
中mod game;
或mod matrix;
。但是,我不能使用matrix.rs
之类的语句引用game.rs
中的mod matrix
。
我已经查看了几个资源,并且所有这些资源都只有像树一样的模块结构,而这些结构并没有相互引用。是否可以在Rust中使用彼此文件中的结构/函数,还是违反规则?如果是这样,为什么Rust不允许你这样做?
答案 0 :(得分:11)
mod
是模块声明。该指令声明了一个模块及其所有内容。恰好这些内容可能位于另一个文件中。所以这个:
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
是导入声明。 use
声明从其他模块中提取名称以在当前模块中使用。您可以从该模块的任何位置随时use
matrix
任何模块及其中的任何公共项目。
因此,为了引用game
中的use
,您需要// game.rs
use matrix;
:
matrix
当然,为了使这个工作mod
,应该在箱子根目录中用mod
声明。
作为旁注,我个人认为理解Rust模块系统的最简单方法是首先忘记模块可以放在不同的文件中。也就是说,好像一个箱子只能在一个文件中定义。在Rust mod
中,指令可以有实体并且可以嵌套,因此嵌套的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
指令的单个源文件。事实上,在外部源文件中的所有模块组装成单个文档之后,SeekBar extend ProgressBar
将以此形式打印您的包。我建议在一些具有复杂模块结构的板条箱上运行此命令,以了解它在实践中的外观。