Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

構造体の可視性

構造体には、そのフィールドに対して追加の可視性レベルがあります。可視性は デフォルトでプライベートであり、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 ^ この行をコメント解除してみましょう
}

関連項目:

ジェネリクスメソッド