構造体の可視性
構造体はフィールド内での可視性も持っています。デフォルトではプライベートで、
pub修飾子で上書きできます。この可視性は、定義されたモジュールの外からアクセスする
ときのみ有効で、情報を隠す(カプセル化する)ことを目的としています。
mod my { // ジェネリック型`T`のパブリックフィールドを持ったパブリックな構造体 pub struct OpenBox<T> { pub contents: T, } // ジェネリック型`T`のプライベートフィールドを持ったパブリックな構造体 #[allow(dead_code)] pub struct ClosedBox<T> { contents: T, } impl<T> ClosedBox<T> { // パブリックなコンストラクタメソッド pub fn new(contents: T) -> ClosedBox<T> { ClosedBox { contents: contents, } } } } fn main() { // パブリックフィールドを持ったパブリックな構造体はいつものように宣言できます。 let open_box = my::OpenBox { contents: "public information" }; // そしてフィールドにも普通にアクセスできます。 println!("The open box contains: {}", open_box.contents); // プライベートフィールドを持ったパブリックな構造体はフィールド名で宣言できません。 // エラー! `ClosedBox`にはプライベートフィールドがあります。 //let closed_box = my::ClosedBox { contents: "classified information" }; // TODO ^ この行をアンコメントしてみてください // しかし、パブリックなコンストラクタを使って初期化できます。 let _closed_box = my::ClosedBox::new("classified information"); // そしてプライベートなフィールドにはアクセスできません // エラー! `contents`フィールドはプライベートです //println!("The closed box contains: {}", _closed_box.contents); // TODO ^ この行をアンコメントしてみてください }