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

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