Menu
Coddy logo textTech

Геттеры

Часть раздела Объектно-ориентированное программирование путешествия по 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 остаётся ответственным за свои данные: внешний код может просматривать их, но не может изменять.

challenge icon

Задание

Легко

Давайте создадим систему профилей пользователей, которая демонстрирует, как методы 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}
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Rust