Видимость полей структур 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, чтобы улучшить свои навыки.