Видимість структури
Структури мають додатковий рівень видимості для своїх полів. Видимість
за замовчуванням є приватною і може бути перевизначена за допомогою модифікатора 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 ^ Спробуйте розкоментувати цей рядок
}