Komponent przycisku
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 51 z 61.
Wyzwanie
ŁatwyKontynuujmy budowanie naszego systemu dokumentów, dodając drugi komponent interfejsu użytkownika: Button. Podobnie jak TextField, ten komponent będzie implementował cechę Draw, pokazując, jak różne typy mogą korzystać ze wspólnego interfejsu.
Rozbudujesz projekt o kolejny plik modułu:
draw.rs: Zachowaj cechęDrawz poprzednich wyzwań.text_field.rs: Zachowaj strukturęTextFieldi jej implementację cechyDraw.button.rs: Utwórz strukturęButtonz dwoma publicznymi polami:label(typuString) iwidth(typuu32). Zaimplementuj cechęDrawdlaButtontak, aby wywołaniedraw()wypisywało przycisk w tym formacie:Button: {label} (width: {width})main.rs: Dołącz wszystkie trzy moduły. Utwórz zarównoTextField, jak iButton, a następnie wywołajdraw()dla każdego z nich, aby wyświetlić oba komponenty.
Moduł button będzie musiał uzyskać dostęp do cechy Draw za pomocą crate::draw::Draw, tak jak w przypadku TextField.
Dane wejściowe będą następujące:
- Pierwszy wiersz: zawartość pola tekstowego
- Drugi wiersz: etykieta przycisku
- Trzeci wiersz: szerokość przycisku (jako liczba)
Wynik powinien wyświetlać najpierw pole tekstowe, a następnie przycisk, każdy w osobnym wierszu:
Text: Welcome
Button: Submit (width: 100)Spróbuj swoich sił
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: Utwórz Button z `label` i `width`, a następnie wywołaj draw()
}Wszystkie lekcje w sekcji Programowanie obiektowe
1Metody i zachowanie
Wprowadzenie do bloków implementacjiParametr selfMetody modyfikująceFunkcje powiązaneWiele bloków implementacjiŁańcuchowe wywoływanie metodPowtórzenie — działania na prostokącie4Projekt: Wirtualne zwierzątko
Definiowanie zwierzątkaKarmienie zwierzątka7Standardowe cechy
Cecha DebugCecha DisplayClone i CopyCechy równościPowtórka – punkt do wydrukowania10Projekt: System dokumentów
Trait DrawKomponent tekstowy2Hermetyzacja i moduły
Podstawy modułówSłowo kluczowe publicPola prywatneGetterySetteryPodsumowanie — bezpieczna skrytka5Typy generyczne
Struktury generyczneMetody generyczneWiele typów generycznychFunkcje generycznePodsumowanie – punkt współrzędnych8Cechy jako ograniczenia
Składnia ograniczeń cechWiele ograniczeńKlauzula whereZwracanie typów z użyciem cechPodsumowanie — generyczna drukarka11Wzorce projektowe w Rust
Wzorzec NewtypeKompozycjaTrait DropFrom i IntoPodsumowanie — atrapowy inteligentny wskaźnik3Zaawansowane typy wyliczeniowe
Typy wyliczeniowe z danymiMetody typów wyliczeniowychDopasowywanie wariantów danychTyp wyliczeniowy Option — powtórzeniePodsumowanie — typ wyliczeniowy Shape6Definiowanie cech
Czym jest cecha?Implementowanie cechImplementacje domyślneNadpisywanie wartości domyślnychCechy z parametramiPowtórzenie — odtwarzacz multimedialnyPoćwicz samodzielnie: Kompilator Rust online