Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 6 из 61.

До сих пор наши mutable методы изменяли struct и ничего не возвращали. Но что, если мы хотим последовательно вызвать несколько методов для одного и того же экземпляра? Возвращая ссылку на self, мы включаем method chaining: шаблон, в котором несколько вызовов методов объединяются в одном expression.

Ключ заключается в том, чтобы ваши методы &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
    }
}

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

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
}

Вместо записи three отдельных инструкций мы настраиваем всё в одной плавной line. Этот шаблон в стиле конструктора особенно полезен при setting up объектов с множеством необязательных settings, делая ваш код более кратким и удобным для чтения.

challenge icon

Задание

Легко

Create структуру TextStyle с тремя полями: bold (bool), italic (bool) и size (u32).

Add блок implementation для TextStyle со следующим содержимым:

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

Ты получишь three входных значения:

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

Create изменяемый TextStyle с помощью new, затем используй method chaining, чтобы apply all three settings в single expression. Выведи итоговое состояние в формате, показанном ниже.

Ожидаемый format вывода:

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

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

use std::io;

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


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


fn main() {
    let mut input = String::new();
    
    // Прочитать настройку bold
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let bold: bool = input.trim().parse().expect("Invalid bool");
    input.clear();
    
    // Прочитать настройку italic
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let italic: bool = input.trim().parse().expect("Invalid bool");
    input.clear();
    
    // Прочитать настройку size
    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Проверьте себя

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

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

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