Запуск Screen
Часть раздела Объектно-ориентированное программирование путешествия по Rust на Coddy. Урок 53 из 61.
Задание
ЛегкоПоздравляем с переходом к последнему шагу проекта Document System! Ты создал все отдельные элементы: trait Draw, TextField, Button и Screen. Теперь пришло время дать твоему Screen возможность отображать все свои components одновременно с помощью одного вызова method.
Ты завершишь проект, добавив method run в struct Screen. Этот method будет проходить по всем components, хранящимся на экране, и вызывать draw() для каждого из них, воплощая всю твою систему документов в жизнь.
Файлы проекта:
draw.rs: твой traitDrawс methoddraw.text_field.rs: твой componentTextField, который выводитText: {content}.button.rs: твой componentButton, который выводитButton: {label} (width: {width}).screen.rs: твой structScreenс methodsnewиadd. Добавь methodrun, который takes&selfи вызываетdraw()для every component в коллекции.main.rs: объедини всё вместе: создайScreen, добавь свои components и вызовиrun(), чтобы отобразить весь экран за один раз.
Method run инкапсулирует логику отображения внутри Screen, делая твою главную function чистой и простой. Вместо того чтобы вручную проходить по components в main, ты просто вызываешь screen.run().
Будут предоставлены следующие входные данные:
- Первая строка: content текстового поля
- Вторая строка: label кнопки
- Третья строка: width кнопки (число)
В результате каждый component должен отображаться в отдельной строке в порядке их добавления:
Text: Dashboard
Button: Save (width: 120)Попробуйте сами
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");
let mut screen = Screen::new();
let text_field = TextField { content };
screen.add(Box::new(text_field));
let button = Button { label, width };
screen.add(Box::new(button));
// TODO: Замените ручную итерацию ниже одним вызовом screen.run()
for component in &screen.components {
component.draw();
}
}Все уроки раздела Объектно-ориентированное программирование
1Методы и поведение
Введение в блоки реализацииПараметр SelfИзменяемые методыАссоциированные функцииНесколько блоков реализацииЦепочки вызовов методовИтоги: действия с Rectangle4Проект: Виртуальный питомец
Определение питомцаКормление питомца2Инкапсуляция и модули
Основы модулейКлючевое слово PublicПриватные поляГеттерыСеттерыИтоги — Безопасный сейф5Обобщения
Обобщённые структурыОбобщённые методыНесколько обобщённых типовОбобщённые функцииПовторение — Координатная точка8Трейты как ограничения
Синтаксис ограничений трейтовМножественные ограниченияКонструкция whereВозврат типов с трейтамиИтоги — Обобщённый принтер11Паттерны проектирования в Rust
Паттерн NewtypeКомпозицияТрейт DropFrom и IntoИтоги — Мок-объект Smart Pointer3Продвинутые перечисления
Перечисления с даннымиМетоды в перечисленияхСопоставление вариантов с даннымиСнова об Option EnumИтоги — перечисление Shape6Определение трейтов
Что такое трейт?Реализация трейтовРеализации по умолчаниюПереопределение реализаций по умолчаниюТрейты с параметрамиИтоги — Media PlayerПотренируйтесь самостоятельно: Онлайн-компилятор Rust