为何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
相关产品推荐
相关产品推荐

