Menu
Coddy logo textTech

Запуск Screen

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

challenge icon

Задание

Легко

Поздравляем с достижением финального этапа проекта Document System! Вы создали все отдельные части — типаж Draw, TextField, Button и Screen. Теперь пришло время наделить ваш Screen способностью отрисовывать все свои компоненты сразу одним вызовом метода.

Вы завершите свой проект, добавив метод run в структуру Screen. Этот метод будет перебирать все компоненты, хранящиеся в экране, и вызывать draw() для каждого из них, оживляя всю вашу систему документов.

Файлы вашего проекта:

  • draw.rs: Ваш типаж Draw с методом draw.
  • text_field.rs: Ваш компонент TextField, который выводит Text: {content}.
  • button.rs: Ваш компонент Button, который выводит Button: {label} (width: {width}).
  • screen.rs: Ваша структура Screen с методами new и add. Добавьте метод run, который принимает &self и вызывает draw() для каждого компонента в коллекции.
  • main.rs: Соберите все вместе — создайте Screen, добавьте свои компоненты и вызовите run(), чтобы отрисовать весь экран за один раз.

Метод run инкапсулирует логику отрисовки внутри Screen, делая вашу функцию main чистой и простой. Вместо того чтобы вручную перебирать компоненты в main, вы просто вызываете screen.run().

Будут предоставлены следующие входные данные:

  • Первая строка: содержимое текстового поля
  • Вторая строка: метка кнопки
  • Третья строка: ширина кнопки (в виде числа)

Ваш вывод должен отображать каждый компонент на отдельной строке в том порядке, в котором они были добавлены:

Text: Dashboard
Button: Save (width: 120)

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

mod draw;
mod text_field;
mod button;
mod screen;

use draw::Draw;
use text_field::TextField;
use button::Button;
use screen::Screen;

pub struct Label {
    pub text: String,
}

impl Draw for Label {
    fn draw(&self) {
        println!("{}", self.text);
    }
}

fn main() {
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let content = input1.trim().to_string();

    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let label = input2.trim().to_string();

    let mut input3 = String::new();
    std::io::stdin().read_line(&mut input3).expect("Failed to read line");
    let width: u32 = input3.trim().parse().expect("Failed to parse width");

    let mut screen = Screen::new();

    let text_field = TextField { content };
    screen.add(Box::new(text_field));

    let button = Button { label, width };
    screen.add(Box::new(button));

    // TODO: Замените ручную итерацию ниже одним вызовом screen.run()
    for component in &screen.components {
        component.draw();
    }
}

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