構造体の場合

構造体はそれ自身に加え、フィールドごとにもパブリック・プライベートを設定することができます。デフォルトではプライベートですが、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 ^ ここをアンコメントしてみましょう。
}

参照

ジェネリクス, メソッド