我可以在Rust中包含“侧面”模块吗?

时间:2016-02-11 05:16:13

标签: rust

我想将Rust程序拆分为多个文件,但使用mod并不允许我从main.rs以外的文件引用同一目录中的文件。

例如,如果我在同一个文件夹中有main.rsgame.rsmatrix.rs,我可以从game.rsmatrix.rs引用结构/函数在main.rsmod game;mod matrix;。但是,我不能使用matrix.rs之类的语句引用game.rs中的mod matrix

我已经查看了几个资源,并且所有这些资源都只有像树一样的模块结构,而这些结构并没有相互引用。是否可以在Rust中使用彼此文件中的结构/函数,还是违反规则?如果是这样,为什么Rust不允许你这样做?

1 个答案:

答案 0 :(得分:11)

mod模块声明。该指令声明了一个模块及其所有内容。恰好这些内容可能位于另一个文件中。所以这个:

mod game;
mod matrix;

大致相当于:

mod game {
    // game.rs contents
}

mod matrix {
    // matrix.rs contents
}

当然,由于mod是模块的声明,因此您无法对同一模块多次执行此操作。也就是说,您可以尝试编写类似

的内容
mod game {
    mod matrix;
    ...
}

mod matrix;

但是,正如您所看到的,matrixgame::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

如果您只有一个文件,则可以轻松查看usemod name;指令的工作方式,并且模块之间的关系应该清晰。

现在你只需要在图片中添加一个事实,即如果一个模块声明没有正文,就像name.rs一样,它的内容是从name/mod.rsmod加载的,无论有什么。但是,完整的图片并没有丝毫变化 - 这些仍然是嵌套的模块,它们始终表示为具有嵌套cargo rustc -Z unstable-options --pretty=normal指令的单个源文件。事实上,在外部源文件中的所有模块组装成单个文档之后,SeekBar extend ProgressBar将以此形式打印您的包。我建议在一些具有复杂模块结构的板条箱上运行此命令,以了解它在实践中的外观。