Componente pulsante
Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 51 di 61.
Sfida
FacileContinuiamo a costruire il nostro sistema di documenti aggiungendo un secondo componente dell’interfaccia utente: un Button. Proprio come TextField, questo componente implementerà il trait Draw, dimostrando come tipi diversi possano condividere un’interfaccia comune.
Espanderai il tuo progetto con un altro file di modulo:
draw.rs: Mantieni il traitDrawdelle sfide precedenti.text_field.rs: Mantieni la structTextFielde la sua implementazione diDraw.button.rs: Crea una structButtoncon due campi pubblici:label(unaString) ewidth(unu32). Implementa il traitDrawperButton, in modo che chiamandodraw()venga stampato il pulsante in questo formato:Button: {label} (width: {width})main.rs: Includi tutti e tre i moduli. Crea sia unTextFieldsia unButton, poi chiamadraw()su ciascuno per visualizzare entrambi i componenti.
Il tuo modulo button dovrà accedere al trait Draw usando crate::draw::Draw, proprio come hai fatto con TextField.
Verranno forniti i seguenti input:
- Prima riga: il contenuto del campo di testo
- Seconda riga: l’etichetta del pulsante
- Terza riga: la larghezza del pulsante (come numero)
L'output dovrebbe mostrare prima il campo di testo, poi il pulsante, ciascuno sulla propria riga:
Text: Welcome
Button: Submit (width: 100)Provalo tu
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: Crea un Button con `label` e `width`, poi chiama draw()
}Tutte le lezioni di Programmazione orientata agli oggetti
1Metodi e comportamento
Introduzione ai blocchi implIl parametro selfMetodi mutabiliFunzioni associateBlocchi impl multipliConcatenamento di metodiRiepilogo - Azioni sul rettangolo4Progetto: animale domestico virtuale
Definire l'animaleNutrire l'animale7Trait standard
Il trait DebugIl trait DisplayClone e CopyTrait di uguaglianzaRiepilogo - Punto stampabile10Progetto: sistema di documenti
Il trait DrawComponente di testo2Incapsulamento e moduli
Nozioni di base sui moduliLa parola chiave publicCampi privatiGetterSetterRiepilogo - Armadietto sicuro5Generics
Struct genericheMetodi genericiPiù tipi genericiFunzioni genericheRipasso - Punto di coordinate8I Trait come vincoli
Sintassi dei vincoli sui traitVincoli multipliLa clausola whereRestituire tipi con i traitRiepilogo - Stampante generica11Modelli di progettazione in Rust
Pattern NewtypeComposizioneIl trait DropFrom e IntoRipasso - Mock con smart pointer3Enumerazioni avanzate
Enumerazioni con datiMetodi sulle enumerazioniCorrispondenza delle varianti con datiL'enumerazione Option ripresaRiepilogo - enumerazione Shape6Definizione dei trait
Che cos’è un trait?Implementare i traitImplementazioni predefiniteSovrascrivere le implementazioni predefiniteTrait con parametriRiepilogo - Lettore multimedialeEsercitati da solo: Compilatore Rust online