Menu
Coddy logo textTech

Структура Screen

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

challenge icon

Задание

Легко

Теперь пришло время собрать все ваши UI-компоненты вместе! Вы создадите структуру Screen, которая может содержать коллекцию различных отрисовываемых компонентов, используя объекты типажа (trait objects). Именно здесь мощь Vec<Box<dyn Draw>> проявляется в полной мере — одна коллекция, которая управляет несколькими типами компонентов.

Вы добавите новый модуль в свой растущий проект:

  • draw.rs: Ваш типаж Draw из предыдущих задач.
  • text_field.rs: Ваш компонент TextField, который выводит Text: {content}.
  • button.rs: Ваш компонент Button, который выводит Button: {label} (width: {width}).
  • screen.rs: Создайте структуру Screen, которая содержит публичное поле components типа Vec<Box<dyn Draw>>. Реализуйте ассоциированную функцию new, которая создает пустой экран, и метод add, который принимает Box<dyn Draw> и добавляет его в вектор компонентов.
  • main.rs: Соберите все модули вместе. Создайте Screen, добавьте в него TextField и Button, затем переберите компоненты экрана и вызовите draw() для каждого из них.

Вашему Screen необходимо хранить объекты типажа, поэтому вы будете использовать ключевое слово dyn с вашим типажом Draw. Метод add должен принимать &mut self, так как он изменяет вектор компонентов.

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

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

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

Text: Hello
Button: Click Me (width: 80)

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

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");

    // TODO: Создайте Screen, используя Screen::new()
    // TODO: Добавьте TextField, обернутый в Box::new(), в screen
    // TODO: Добавьте Button, обернутую в Box::new(), в screen
    // TODO: Переберите screen.components и вызовите draw() для каждого компонента
}

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