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

为何Rust中main.rs定义的结构体字段无需pub即可在main函数访问?

Rust模块可见性的两个常见疑问解答

一、同一模块内结构体字段无需pub就能访问的原因

Rust的可见性规则核心是:模块内部的所有项(包括结构体、结构体字段、函数、子模块等),对模块内的其他同级项都是默认可见的,私有性限制的只是模块外部的访问。

在你的第一个示例中,Config结构体和main函数都处于根模块(默认的顶级模块),属于同一模块内的同级成员。所以哪怕Config的字段没加pub,main作为同模块的项,完全有权限直接访问和初始化这些字段。

struct Config {
    query: String,
    file_path: String,
}

fn main() {
    let _ = Config { query: String::from("abc"), file_path: String::from("dt.txt") } ;
}

二、嵌套子模块无法被父模块同级访问的原因

Rust的子模块默认是私有的,私有成员的可见范围仅限定义它的模块内部,以及该模块的所有子模块,但不包含父模块的同级项(比如根模块的main函数)。

在你的第二个示例中,m2是m1的私有子模块,它的可见范围只限于m1内部。而main函数在根模块,属于m1的同级项,不在m2的可见范围内,所以无法直接访问m1::m2。

mod m1 {
    mod m2 {
        // ...
    }
}

fn main() {
    // 无法访问m1::m2,因为m2是m1的私有子模块
}

如果要让main能访问m1::m2,只需把m2标记为pub:

mod m1 {
    pub mod m2 {
        // ...
    }
}

fn main() {
    // 现在可以正常访问m1::m2
    m1::m2::...;
}

核心规则总结

  • 同一模块内的所有项互相可见,不受私有性限制
  • 未加pub的私有项,可见范围是定义它的模块及其所有子模块
  • 加pub的公有项,可以被模块外部的代码访问

内容的提问来源于stack exchange,提问作者Eason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:32:07