Menu
Coddy logo textTech

Геттеры

Часть раздела 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
}

Геттеры предоставляют вам контролируемый доступ на чтение, сохраняя при этом само поле защищенным. Структура остается ответственной за свои данные — внешний код может смотреть, но не может их изменять.

challenge icon

Задание

Легко

Давайте создадим систему профилей пользователей, которая демонстрирует, как методы-геттеры обеспечивают контролируемый доступ для чтения к приватным данным.

Вы создадите два файла для организации вашего кода:

  • 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}
}
quiz iconПроверьте себя

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

Все уроки раздела Object Oriented Programming