You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Rust模块结构的两处技术疑问咨询

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:15:00