关于Rust模块结构的两处技术疑问咨询
1. 非crate根文件里怎么能声明模块?
你提到的在garden.rs里创建garden模块,其实是Rust允许的内联模块声明——不管当前文件属于哪个父模块,都可以用mod 模块名 { ... }的语法在文件内部直接定义子模块。
举个例子:如果在main.rs里写mod garden;,Rust会自动把src/garden.rs的内容作为crate::garden模块的内容。而如果你在garden.rs里写:
// src/garden.rs mod garden { // 这里是crate::garden::garden模块的内容 }
这完全合法,相当于在crate::garden这个父模块下,又定义了一个名为garden的子模块。
官方文档说的“在crate根文件中可以声明新模块”,指的是通过文件系统引入新模块(即mod 模块名;这种会对应加载文件的方式),而内联模块的声明不受文件位置限制,任何模块内部都能加。
2. 子模块必须对应目录结构吗?
不是必须,但文件系统的结构通常和模块结构对应,方便管理。子模块有两种创建方式:
内联声明:直接在父模块的文件里写
mod submod { ... },不需要额外创建文件或目录。文件系统关联:如果要把子模块内容拆分到单独文件,就需要对应目录结构:
比如你给出的目录:backyard ├── Cargo.lock ├── Cargo.toml └── src ├── garden │ └── vegetables.rs ├── garden.rs └── main.rs在
garden.rs里写mod vegetables;,Rust就会自动加载src/garden/vegetables.rs,这个文件的内容会成为crate::garden::vegetables模块。另外还有一种等价结构:把
src/garden.rs换成src/garden/mod.rs,然后在main.rs里写mod garden;,Rust会加载src/garden/mod.rs作为crate::garden模块,再在mod.rs里用mod vegetables;加载同目录的vegetables.rs,效果完全一样。
内容的提问来源于stack exchange,提问作者Rio

