Menu
Coddy logo textTech

Компонент Button

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

challenge icon

Задание

Легко

Давайте продолжим создание нашей системы документов, добавив второй компонент пользовательского интерфейса: Button. Как и TextField, этот компонент будет реализовывать трейт Draw, демонстрируя, как различные типы могут иметь общий интерфейс.

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

  • draw.rs: Сохраните ваш трейт Draw из предыдущих испытаний.
  • text_field.rs: Сохраните вашу структуру TextField и её реализацию Draw.
  • button.rs: Создайте структуру Button с двумя публичными полями: label (типа String) и width (типа u32). Реализуйте трейт Draw для Button так, чтобы вызов draw() выводил кнопку в следующем формате: Button: {label} (width: {width})
  • main.rs: Подключите все три модуля. Создайте экземпляры TextField и Button, затем вызовите draw() для каждого из них, чтобы отрисовать оба компонента.

Вашему модулю button потребуется доступ к трейту Draw через crate::draw::Draw, точно так же, как вы это делали для TextField.

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

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

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

Text: Welcome
Button: Submit (width: 100)

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

mod draw;
mod text_field;
mod button;

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

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 text_field = TextField { content };
    text_field.draw();

    // TODO: Создайте Button с `label` и `width`, затем вызовите draw()
    
}

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