Riepilogo - Stampante generica
Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 44 di 61.
Sfida
FacileCostruiamo un sistema di annunci flessibile che dimostri la potenza dei vincoli sui trait! Creerai un trait Printable e una funzione generica che può annunciare qualsiasi tipo che implementi questo trait: vedrai come generics e trait collaborano per creare codice riutilizzabile e sicuro rispetto ai tipi.
Organizzerai il codice in due file:
printable.rs: Definisci un trait pubblicoPrintablecon un metodoprint_infoche accetta&selfe restituisce unaString. Poi crea una funzione generica pubblica chiamataannounceche accetta qualsiasi tipoTche implementiPrintable. Questa funzione dovrebbe stampareAnnouncement: {info}, dove{info}è il risultato della chiamata aprint_info()sull'elemento.main.rs: Crea due struct pubbliche che implementanoPrintable:Person: con un campo pubbliconame(String). Il suo metodoprint_infodovrebbe restituirePerson: {name}Product: con i campi pubbliciname(String) eprice(f64). Il suo metodoprint_infodovrebbe restituireProduct: {name} - ${price}
announcecon ciascuno per dimostrare che la tua funzione generica funziona con qualsiasi tipoPrintable.
La bellezza di questo design è che announce non si preoccupa di ricevere una Person, un Product o qualsiasi tipo futuro. Richiede solo che il tipo possa fornire informazioni tramite print_info(). Il vincolo del trait lo garantisce al momento della compilazione.
L'output dovrebbe mostrare entrambi gli annunci:
Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}Ad esempio, con gli input Alice, Laptop e 999.99:
Announcement: Person: Alice
Announcement: Product: Laptop - $999.99Riceverai tre input: il nome della persona, il nome del prodotto e il prezzo del prodotto (da analizzare come f64).
Provalo tu
mod printable;
use printable::{Printable, announce};
// TODO: Definisci una struct pubblica Person con un campo pubblico name (String)
// Implementa il trait Printable per Person
// print_info dovrebbe restituire "Person: {name}"
// TODO: Definisci una struct pubblica Product con i campi pubblici name (String) e price (f64)
// Implementa il trait Printable per Product
// print_info dovrebbe restituire "Product: {name} - ${price}"
fn main() {
// Leggi gli input
let mut person_name = String::new();
std::io::stdin().read_line(&mut person_name).expect("Failed to read line");
let person_name = person_name.trim().to_string();
let mut product_name = String::new();
std::io::stdin().read_line(&mut product_name).expect("Failed to read line");
let product_name = product_name.trim().to_string();
let mut price_input = String::new();
std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
let price: f64 = price_input.trim().parse().expect("Failed to parse price");
// TODO: Crea un'istanza di Person con person_name
// TODO: Crea un'istanza di Product con product_name e price
// TODO: Chiama announce con Person
// TODO: Chiama announce con Product
}
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