我想将一个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不让你这样做?
Vla*_*eev 12
mod是模块声明.该指令声明了一个模块及其所有内容.恰好这些内容可能位于另一个文件中.所以这:
mod game;
mod matrix;
Run Code Online (Sandbox Code Playgroud)
大致相当于这个:
mod game {
// game.rs contents
}
mod matrix {
// matrix.rs contents
}
Run Code Online (Sandbox Code Playgroud)
当然,由于mod是模块的声明,因此对于同一模块,您不能多次执行此操作.也就是说,你可以尝试写一些类似的东西
mod game {
mod matrix;
...
}
mod matrix;
Run Code Online (Sandbox Code Playgroud)
但是,正如您所看到的,matrix并且game::matrix是不同的模块,并且自然rustc需要不同的路径到它们各自的文件,如果它们是外部的.
use但是,是进口申报.use声明从其他模块中提取名称以在当前模块中使用.您可以use从该模块的任何位置随时随地访问任何模块和任何公共项目.
所以,为了参考matrix从game你需要use它:
// game.rs
use matrix;
Run Code Online (Sandbox Code Playgroud)
当然,为了使这个工作,matrix应该mod在箱子根目录中声明.
作为旁注,我个人认为理解Rust模块系统的最简单方法是首先忘记模块可以放在不同的文件中.也就是说,好像一个箱子只能在一个文件中定义.在Rust中,mod指令可以有实体并且可以嵌套,因此嵌套的mods实际上定义了一个包的模块系统:
mod foo {
mod bax {
...
}
mod baz {
...
}
}
mod bar {
mod qux {
mod zux {
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您只有一个文件,则可以轻松查看指令mod和use指令的工作方式,并且模块之间的关系应该变得清晰.
现在你只需要在图片中添加这样一个事实,即如果一个模块声明没有正文,就像在mod name;其中一样,它的内容是从name.rs或者加载的,或者name/mod.rs是任何可用的.但是,完整的图片并没有丝毫变化 - 这些仍然是嵌套模块,它们总是可以表示为具有嵌套mod指令的单个源文件.实际上,cargo rustc -Z unstable-options --pretty=normal在外部源文件中的所有模块组装成单个文档之后,将以此形式打印您的包.我建议在一些具有复杂模块结构的板条箱上运行此命令,以了解它在实践中的外观.
| 归档时间: |
|
| 查看次数: |
531 次 |
| 最近记录: |