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

Gue*_*OCs 2 rust rust-cargo

main.rs
main2.rs
file1.rs
src/something.rs
Cargo.toml
Run Code Online (Sandbox Code Playgroud)

on main.rs,做mod file1工作,但做mod file1onmain2.rs会导致

file not found for module `file1`
Run Code Online (Sandbox Code Playgroud)

为什么只能main.rs用 声明同级文件mod?

Sve*_*rev 5

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

这两个文件很特殊 - 它们被称为crate root,因为它们形成树状结构。每个模块都应该是它的一部分。您不能在该树之外定义模块。这在书中再次得到了解释。

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