Rust 编程中的结构可见性
Rust中的结构包含额外级别的可见性。这些可以由开发人员根据他/她的方便进行修改。
在正常情况下,知名度结构的锈是私有的,它可以通过利用来公开酒馆修改。
应该注意的是,这种可见性情况仅在我们尝试从模块外部访问结构字段时才有意义,从它定义的地方。
当我们隐藏struct的字段时,我们只是试图封装数据。
示例
考虑下面显示的例子-
mod my { //具有泛型类型“T”的公共字段的公共结构 pub struct OpenStruct { pub contents: T, } //具有泛型类型“T”的私有字段的公共结构 #[allow(dead_code)] pub struct ClosedStruct { contents: T, } impl ClosedStructx { //公共构造方法 pub fn new(contents: T) -> ClosedStruct { ClosedStrut { contents: contents, } } } } fn main() { //可以像往常一样构造具有公共字段的公共结构 let open_box = my::OpenStruct { contents: "public information" }; //并且它们的字段可以正常访问。 println!("The open box contains: {}", open_box.contents); }
在上面的代码中,我们创建了两个结构体,它们本质上都是公共的,但是其中一个结构体的字段设置为公共,而另一个结构体字段是私有的。稍后在main函数中,我们尝试构造名为OpenStruct的公共结构的公共字段,然后我们打印这些字段。
输出结果
The open box contains: public information
一切正常。但是,现在如果我们像访问OpenStruct一样尝试访问名为ClosedStruct的结构及其字段,就会出现此错误。
代码
let closed_box = my::ClosedBox { contents: "classified information" };
我们会得到一个错误。
输出结果
error[E0451]: field `contents` of struct `ClosedBox` is private --> src/main.rs:32:38 | 32| let closed_box = my::ClosedBox { contents: "classified information" }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ private field
虽然应该注意的是,可以使用公共构造函数创建具有私有字段的结构,但是我们仍然无法访问私有字段。
let _closed_box = my::ClosedBox::new("classified information");
它会正常工作。