gpt4 book ai didi

rust - 我可以在 Rust 中包含模块 "sideways"吗?

转载 作者:行者123 更新时间:2023-11-29 07:46:08 25 4
gpt4 key购买 nike

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

例如,如果我在同一个文件夹中有main.rsgame.rsmatrix.rs,我可以引用来自 game.rsmatrix.rs 的结构/函数在 main.rs 中与 mod 游戏;模矩阵;。但是,我无法使用 mod matrix 之类的语句从 game.rs 引用 matrix.rs

我看过几个资源,它们都只有像树一样的模块结构,彼此不引用。是否可以在 Rust 中相互使用文件中的结构/函数,或者这是否违反规则?如果是这样,为什么 Rust 不允许你这样做?

最佳答案

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 声明从其他模块中提取名称以用于当前模块。您可以在任何可访问该模块的地方使用任何模块和其中的任何公共(public)项。

因此,为了从 game 中引用 matrix,您需要使用它:

// game.rs
use matrix;

当然,为了让它工作,matrix 应该在 crate root 中用 mod 声明。

作为旁注,我个人认为理解 Rust 模块系统的最简单方法是首先忘记模块可以放在不同的文件中。也就是说,假设一个 crate 只能在一个文件中定义。在 Rust 中,mod 指令可以有主体并且可以嵌套,所以嵌套的 mod 实际上定义了一个 crate 的模块系统:

mod foo {
mod bax {
...
}
mod baz {
...
}
}
mod bar {
mod qux {
mod zux {
...
}
}
}

如果你只有一个文件,你可以很容易地看到 moduse 指令是如何工作的,模块之间的关系应该变得清晰。

现在你只需要添加一个事实,如果一个模块没有主体声明,比如 mod name;,它的内容是从 name.rs 加载的name/mod.rs,任何可用的。然而,全貌丝毫没有改变——这些仍然是嵌套模块,总是可以表示为带有嵌套 mod 指令的单个源文件。事实上,cargo rustc -Z unstable-options --pretty=normal 将在外部源文件中的所有模块组装成一个文件后以这种形式打印你的箱子。我建议在一些具有复杂模块结构的箱子上运行这个命令,看看它在实践中的样子。

关于rust - 我可以在 Rust 中包含模块 "sideways"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35331289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com