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

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