構造体の可視性
構造体には、そのフィールドに対して追加の可視性レベルがあります。可視性は デフォルトでプライベートであり、pub 修飾子で上書きできます。この 可視性が関係するのは、構造体が定義されているモジュールの外部からアクセスされる場合のみであり、 情報を隠蔽すること(カプセル化)を目的としています。
mod my { // ジェネリック型 `T` のパブリックフィールドを持つパブリック構造体 pub struct OpenBox<T> { pub contents: T, } // ジェネリック型 `T` のプライベートフィールドを持つパブリック構造体 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: "公開情報" }; // そして、そのフィールドには通常どおりアクセスできます。 println!("開いた箱の中身: {}", open_box.contents); // プライベートフィールドを持つパブリック構造体は、フィールド名を使って構築できません。 // エラー!`ClosedBox` にはプライベートフィールドがあります //let closed_box = my::ClosedBox { contents: "機密情報" }; // TODO ^ この行をコメント解除してみましょう // ただし、プライベートフィールドを持つ構造体は // パブリックなコンストラクタを使って作成できます let _closed_box = my::ClosedBox::new("機密情報"); // また、パブリック構造体のプライベートフィールドにはアクセスできません。 // エラー!`contents` フィールドはプライベートです //println!("閉じた箱の中身: {}", _closed_box.contents); // TODO ^ この行をコメント解除してみましょう }