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