为什么只有main.rs可以声明mod?

Why only main.rs can declare mod?

main.rs
main2.rs
file1.rs
src/something.rs
Cargo.toml

main.rs 上执行 mod file1 有效,但在 main2.rs 上执行 mod file1 会导致

file not found for module `file1`

为什么只有 main.rs 可以声明与 mod 的兄弟文件?

可以从 main.rslib.rs 声明新模块。第一个用于二进制包,后者用于库。重要的是要注意,如果一个包有两个文件,那么它将有两个同名的箱子(一个库和一个二进制文件)。如果您在 src/bin 中定义 crate roots (下面解释),您也可以有多个二进制包 - 每个文件将被视为一个单独的二进制包。这在 the rust book.

中有详细解释

这两个文件很特殊 - 它们被称为 crate roots,因为它们形成了一个树状结构。每个模块都应该是它的一部分。您不能在该树之外定义模块。这个再解释一下in the book.

因此,为了能够从 main2.rs 中定义一个新模块,它要么必须是 crate root - 即它必须有一个 main() 并且位于在 /src/bin/main2.rs 中,或者它必须是模块树的一部分,从一些板条箱根部下降。