在Rust中,访问修饰符(pub, pub(crate), pub(super))作为一种封装和明确控制数据和函数访问的机制出现,这是C语言所缺乏的。其理念是限制模块元素的可见性,并只向库的用户提供真正需要的东西。
关键的复杂性在于,即使结构体本身被声明为公共(pub),其字段在默认情况下仍然是私有的。还常常问到:如何合理组织对嵌套结构和模块的访问,而不破坏封装,避免API“漏水”或过于封闭。
对于结构体,必须单独为字段指定访问修饰符。在设计自动生成的结构或存储类型时,应特别仔细考虑哪些部分应该公开,以及哪些部分应被隐藏。这是API和代码架构的重要部分。
代码示例:
mod outer { pub struct Exposed { pub field: i32, hidden: bool, } } // "field" 的使用是可用的, // hidden则不可用。 let e = outer::Exposed { field: 42, hidden: true }; println!("{}", e.field); // e.hidden // 编译错误
关键特点:
一个声明为pub的结构体是否可以在当前模块外部完全不可访问?
可以,如果所有结构体字段保持私有,则它只是名义上是公共的—在模块外部无法创建或初始化结构体实例。
结构体的私有字段是否可以通过继承或其他方式绕过修饰符系统而变得可用?
不,在Rust中没有像OOP语言中的经典继承。对私有字段的访问受到模块的控制,并受到严格限制。
如果创建一个具有公共字段的结构体,但声明模块为私有,会发生什么?
结构体及其字段在父模块外部将不可见—修饰符的作用不会超出父模块的可见性范围。
** 负面案例
用户将结构体声明为pub,但所有字段保持私有。结果外部代码无法正确使用它,既无法创建实例,也无法获得值。
优点:
缺点:
** 积极案例
用户仅通过pub打开必要的字段,同时将敏感细节保留为私有。访问通过getter/setter完成。
优点:
缺点: