Геттеры
Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 11 из 61.
С приватными полями внешний код не может получить прямой доступ к данным вашей структуры. Но иногда вам нужно позволить другим читать данные, не давая им возможности изменять их. Именно здесь на помощь приходят методы-геттеры.
Геттер — это просто публичный метод, который возвращает ссылку на приватное поле:
// 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 (доступ только для чтения) и возвращает значение приватного поля. В Rust геттеры обычно называются так же, как и само поле — префикс get_ не требуется.
Теперь внешний код может считывать баланс через метод:
// 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
}
Геттеры предоставляют вам контролируемый доступ на чтение, сохраняя при этом само поле защищенным. Структура остается ответственной за свои данные — внешний код может смотреть, но не может их изменять.
Задание
ЛегкоДавайте создадим систему профилей пользователей, которая демонстрирует, как методы-геттеры обеспечивают контролируемый доступ для чтения к приватным данным.
Вы создадите два файла для организации вашего кода:
profile.rs: Определите структуруUserProfileс двумя приватными полями:username(String) иage(u32). Сама структура должна быть публичной, но поля должны оставаться приватными. Реализуйте публичный конструкторnew, который принимает имя пользователя и возраст. Затем добавьте два метода-геттера:username— возвращает ссылку на имя пользователя (&String)age— возвращает значение возраста (u32)
main.rs: Подключите модуль profile, создайтеUserProfileи используйте методы-геттеры для вывода информации о пользователе.
Помните, что геттеры в Rust обычно называются так же, как и само поле — префикс get_ не требуется. Для полей типа String возвращайте ссылку, чтобы избежать ненужного копирования.
Ваш вывод должен соответствовать следующему формату:
Username: {username}
Age: {age}Например, если вы создадите профиль с именем пользователя "alice" и возрастом 25, вывод будет таким:
Username: alice
Age: 25Вы получите два входных значения: имя пользователя и возраст.
Шпаргалка
Геттер — это публичный метод, который предоставляет доступ только для чтения к приватному полю.
Геттеры позволяют внешнему коду просматривать данные, не имея возможности изменять их напрямую:
pub struct Wallet {
balance: f64,
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Wallet { balance: initial }
}
pub fn balance(&self) -> f64 {
self.balance
}
}
В Rust геттеры именуются так же, как и само поле — префикс get_ не требуется.
Для полей, содержащих владеемые данные, такие как String, возвращайте ссылку, чтобы избежать ненужного копирования:
pub fn name(&self) -> &String {
&self.name
}
Использование геттера:
let w = Wallet::new(100.0);
println!("Balance: {}", w.balance());
Попробуйте сами
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: {username}
// Age: {age}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media Player