Геттеры
Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 11 из 61.
С private-полями внешний код не может напрямую обращаться к данным вашей структуры. Но иногда нужно позволить другим read данные, не предоставляя им возможности изменять их. Здесь на помощь приходят методы getter.
Геттер — это просто общедоступный метод, который возвращает ссылку на закрытое поле:
// wallet.rs
pub struct Wallet {
balance: f64,
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Wallet { balance: initial }
}
pub fn balance(&self) -> f64 {
self.balance
}
}
Метод balance() принимает &self (доступ только для чтения) и возвращает значение private-поля. В Rust геттеры обычно называются так же, как само поле: префикс get_ не нужен.
Теперь внешний код может прочитать balance через метод:
// main.rs
mod wallet;
use wallet::Wallet;
fn main() {
let w = Wallet::new(100.0);
println!("Balance: {}", w.balance()); // Работает!
}
Для полей, содержащих принадлежащие им данные, например String, часто возвращают ссылку, чтобы избежать ненужного копирования:
pub fn name(&self) -> &String {
&self.name
}
Getter-ы предоставляют контролируемый доступ для чтения, сохраняя само поле защищённым. struct остаётся ответственным за свои данные: внешний код может просматривать их, но не может изменять.
Задание
ЛегкоДавайте создадим систему профилей пользователей, которая демонстрирует, как методы getter предоставляют контролируемый доступ для чтения приватных данных.
Вы создадите два файла, чтобы организовать свой код:
profile.rs: Определите структуруUserProfileс двумя приватными полями:username(String) иage(u32). Сама структура должна быть публичной, но поля должны оставаться приватными. Реализуйте публичный конструкторnew, принимающий username и age. Затем добавьте два метода getter:username: возвращает ссылку на username (&String)age: возвращает значение age (u32)
main.rs: Подключите модуль profile, создайтеUserProfileи используйте методы getter, чтобы вывести информацию о пользователе.
Помните, что в Rust методы getter обычно называются по имени самого поля: префикс get_ не нужен. Для полей типа String возвращайте ссылку, чтобы избежать ненужного копирования.
Ваш вывод должен соответствовать этому точному формату:
Username: {username}
Age: {age}Например, если вы создадите профиль с username "alice" и age 25, вывод будет таким:
Username: alice
Age: 25Вы получите два входных значения: username и age.
Попробуйте сами
mod profile;
use profile::UserProfile;
fn main() {
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let username = input1.trim().to_string();
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let age: u32 = input2.trim().parse().expect("Failed to parse age");
// TODO: Создайте UserProfile с помощью конструктора
// TODO: Используйте методы-геттеры для вывода username и age
// Формат:
// Username: {username}
// Возраст: {age}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media PlayerПотренируйтесь самостоятельно: Онлайн-компилятор Rust