Компонент Button
Часть раздела Object Oriented Programming путешествия по Rust на Coddy — урок 51 из 61.
Задание
ЛегкоДавайте продолжим создание нашей системы документов, добавив второй компонент пользовательского интерфейса: 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
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media Player