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