Rust 程式設計中的結構可見性


Rust 中的結構包含額外的可見性級別。這些級別可以根據開發人員的便利性進行修改。

在正常情況下,Rust 中的struct 的可見性是私有的,可以使用 pub 修飾符將其變為公有。

需要注意的是,只有當我們嘗試從定義模組外部訪問 struct 欄位時,這種可見性情況才有意義。

當我們隱藏struct 的欄位時,我們只是試圖封裝資料。

示例

考慮下面顯示的示例 −

mod my {
   // A public struct with a public field of generic type `T`
   pub struct OpenStruct {
      pub contents: T,
   }
   // A public struct with a private field of generic type `T`
   #[allow(dead_code)]
   pub struct ClosedStruct {
      contents: T,
   }
   impl ClosedStructx {
      // A public constructor method
      pub fn new(contents: T) -> ClosedStruct {
         ClosedStrut {
            contents: contents,
         }
      }
   }
}
fn main() {
   // Public structs with public fields can be constructed as usual
   let open_box = my::OpenStruct {
      contents: "public information"
   };
   // and their fields can be normally accessed.
   println!("The open box contains: {}", open_box.contents);
}

在上面的程式碼中,我們建立了兩個 struct,它們本質上都是公有的,但是其中一個 struct 的欄位設定為公有,而另一個 struct 的欄位是私有的。稍後在 main 函式中,我們嘗試構造名為 OpenStruct 的公有 struct 的公有欄位,然後列印該欄位。

輸出

The open box contains: public information

一切都執行良好。但是,如果現在我們嘗試訪問名為 ClosedStruct 的結構,以及它的欄位,就像我們對 OpenStruct 所做的那樣,我們將發生此錯誤。

程式碼

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");

它將正常工作。

更新於: 2021 年 4 月 3 日

1K+ 次瀏覽

開啟你的 職業

透過完成課程獲得認證

開始
廣告
© . All rights reserved.