在编程语言 Rust 中,结构体方法和字段的访问级别(可见性)由修饰符控制:pub、pub(crate)、pub(super),以及缺少修饰符(默认是私有的)。
Rust 最初就是为了确保组件的可靠性和隔离性而设计的。对结构体内部部分的访问控制允许封装数据并隐藏实现细节,只公开所需的接口。
开发者常常面临结构体公开但其字段依然私有的情况,或者字段的公开性因结构体或模块的可见性限制而不够。理解嵌套层次尤其困难:如果包含的模块被隐藏,公开的嵌套结构可能无法访问,反之亦然。
在 Rust 中,访问修饰符适用于结构体、字段和方法,以及模块和函数。存在以下级别:
pub — 使元素可从任何地方访问。pub(crate) — 仅在当前 crate 内可访问。pub(super) — 仅在父模块内可访问。代码示例:
mod outer { pub struct PublicStruct { pub field: u32, hidden: u32, } pub(crate) struct CrateStruct { pub value: i32, } struct PrivateStruct { pub secret: i32, } pub mod inner { pub(super) struct SuperStruct { pub super_field: u8, } } }
关键特性:
如果结构体声明为 pub,而其字段没有修饰符,能否从另一个模块访问它们?
不可以,只有结构体本身变得公开,但其字段在模块内部依然私有。要访问字段,它也必须被声明为 pub。
如果将结构体声明为 pub(crate),而内部字段为 pub,会发生什么?
可见性受限于结构体本身。即使字段是 pub,在 crate 外部也无法访问,因为结构体不可见。
pub(crate) struct Secret { pub data: i32, // pub 不通过 pub(crate) }
能否在私有模块内部声明 pub 的结构体并从外部访问它?
不可以。最终可见性是结构体和模块之间的最小值。如果模块是私有的,模块内部的结构体和函数也无法在该模块之外可见。
在项目中,整个结构体都公开,字段也开放,以加快开发速度。稍后,维护向后兼容性和控制字段访问变得困难,因为它们被直接修改。
优点:
缺点:
为公开结构体实现私有字段和公开的构造函数/访问器。结构体仅在所需的模块级别导出。
优点:
缺点: