## 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: "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 ^ ここをアンコメントしてみましょう。
    }

### 参照

ジェネリクス, メソッド