Rust 结构体字段的可见性

Beginner

This tutorial is from open-source community. Access the source code

简介

在本实验中,我们将了解 Rust 中结构体的可见性以及它如何影响其字段的可访问性。

注意:如果实验未指定文件名,你可以使用任何你想要的文件名。例如,你可以使用 main.rs,并通过 rustc main.rs &&./main 进行编译和运行。

结构体可见性

结构体的字段具有额外的可见性级别。其可见性默认为私有,可使用 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 ^ 尝试取消注释这一行
}

总结

恭喜你!你已经完成了结构体可见性实验。你可以在 LabEx 中练习更多实验来提升你的技能。