Menu
Coddy logo textTech

Цепочки вызовов методов

Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 6 из 61.

До сих пор наши изменяемые методы модифицировали структуру и ничего не возвращали. Но что, если мы хотим вызвать несколько методов подряд для одного и того же экземпляра? Возвращая ссылку на self, мы делаем возможной цепочку вызовов методов — паттерн, при котором несколько вызовов методов объединяются в одно выражение.

Ключ в том, чтобы ваши методы &mut self возвращали &mut Self:

struct Config {
    debug: bool,
    timeout: u32,
}

impl Config {
    fn new() -> Config {
        Config { debug: false, timeout: 30 }
    }
    
    fn set_debug(&mut self, value: bool) -> &mut Self {
        self.debug = value;
        self
    }
    
    fn set_timeout(&mut self, seconds: u32) -> &mut Self {
        self.timeout = seconds;
        self
    }
}

Каждый метод изменяет struct, затем возвращает self — изменяемую ссылку на тот же экземпляр. Это позволяет следующему вызову метода немедленно продолжить работу с ним:

fn main() {
    let mut config = Config::new();
    
    config.set_debug(true).set_timeout(60);
    
    println!("Debug: {}, Timeout: {}", config.debug, config.timeout);
    // Вывод: Debug: true, Timeout: 60
}

Вместо того чтобы писать три отдельных инструкции, мы настраиваем всё в одну непрерывную строку. Этот паттерн «строитель» (builder-style) особенно полезен при настройке объектов с множеством необязательных параметров, что делает ваш код более лаконичным и читаемым.

challenge icon

Задание

Легко

Создайте структуру TextStyle с тремя полями: bold (bool), italic (bool) и size (u32).

Добавьте блок реализации для TextStyle со следующим содержимым:

  • new — ассоциированная функция, которая возвращает TextStyle с bold, установленным в false, italic в false, и size в 12
  • set_bold — принимает &mut self и значение bool, устанавливает поле bold и возвращает &mut Self для цепочки вызовов
  • set_italic — принимает &mut self и значение bool, устанавливает поле italic и возвращает &mut Self для цепочки вызовов
  • set_size — принимает &mut self и значение u32, устанавливает поле size и возвращает &mut Self для цепочки вызовов

Вы получите три входных значения:

  • Первая строка: настройка bold (true или false)
  • Вторая строка: настройка italic (true или false)
  • Третья строка: размер шрифта (u32)

Создайте изменяемую переменную TextStyle, используя new, затем используйте цепочку методов для применения всех трех настроек в одном выражении. Выведите конечное состояние в формате, показанном ниже.

Ожидаемый формат вывода:

Bold: {bold}, Italic: {italic}, Size: {size}

Шпаргалка

Методы, которые принимают &mut self, могут возвращать &mut Self для реализации цепочки вызовов методов (method chaining):

impl Config {
    fn set_debug(&mut self, value: bool) -> &mut Self {
        self.debug = value;
        self
    }
    
    fn set_timeout(&mut self, seconds: u32) -> &mut Self {
        self.timeout = seconds;
        self
    }
}

Это позволяет выполнять несколько вызовов методов в одном выражении:

let mut config = Config::new();
config.set_debug(true).set_timeout(60);

Каждый метод изменяет структуру и возвращает изменяемую ссылку на тот же экземпляр, позволяя следующему методу немедленно продолжить работу с ним.

Попробуйте сами

use std::io;

// TODO: Определите структуру TextStyle здесь


// TODO: Добавьте блок реализации для TextStyle с:
// - ассоциированной функцией new()
// - методом set_bold()
// - методом set_italic()
// - методом set_size()


fn main() {
    let mut input = String::new();
    
    // Чтение настройки жирного шрифта
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let bold: bool = input.trim().parse().expect("Invalid bool");
    input.clear();
    
    // Чтение настройки курсива
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let italic: bool = input.trim().parse().expect("Invalid bool");
    input.clear();
    
    // Чтение настройки размера
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let size: u32 = input.trim().parse().expect("Invalid u32");
    
    // TODO: Создайте изменяемый TextStyle, используя new(), затем используйте цепочку методов,
    // чтобы применить все три настройки в одном выражении
    
    
    // TODO: Выведите результат в формате: Bold: {bold}, Italic: {italic}, Size: {size}
    
}
quiz iconПроверьте себя

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

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