## 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 ^ 尝试取消此行注释
    }

### 另请参阅：

泛型和方法