Видимость структуры
Структуры имеют дополнительный уровень видимости благодаря полям. По умолчанию
видимость полей приватная, но это можно изменить с помощью модификатора pub.
Приватная видимость имеет значение только при обращении к структуре извне модуля,
где она определена, и имеет целью скрытие информации (инкапсуляция).
mod my {
// Публичная структура с публичным полем обобщённого типа `T`
pub struct OpenBox<T> {
pub contents: T,
}
// Публичная структура с приватным полем обобщённого типа `T`
#[allow(dead_code)]
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: "классифицированную информацию" };
// ЗАДАНИЕ ^ Попробуйте раскомментировать эту строку
// Однако, структуры с приватными полями могут быть созданы с помощью
// публичного конструктора
let _closed_box = my::ClosedBox::new("классифицированную информацию");
// нельзя получить доступ к приватным полям публичных структур.
// Ошибка! Поле `contents` приватное
//println!("Закрытая упаковка хранит: {}", _closed_box.contents);
// ЗАДАНИЕ ^ Попробуйте раскомментировать эту строку
}