Catalogo della biblioteca
Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 60 di 61.
Sfida
FacileCostruiamo un sistema di catalogo bibliotecario che dimostri come i trait unificano tipi diversi tramite un’interfaccia comune! Creerai un catalogo in cui libri e riviste, pur avendo proprietà diverse, possono descriversi tramite un trait condiviso.
Organizzerai il codice in tre file:
catalog.rs: Definisci il traitCatalogItemcon un solo metodo,description, che restituisce unaString. Questo trait stabilisce il contratto che tutti gli elementi della biblioteca devono rispettare.items.rs: Crea due struct che implementano il tuo trait. UnBookha untitlee unauthor(entrambi di tipo String), mentre unMagazineha unname(di tipo String) e un numero diissue(u32). Ogni struct deve implementareCatalogItemcon un formato di descrizione specifico.main.rs: Importa entrambi i moduli e crea istanze di Book e Magazine usando gli input forniti. Chiama il metododescriptionper ciascun elemento e stampa i risultati.
La descrizione di Book deve seguire questo formato:
Book: {title} by {author}La descrizione di Magazine deve seguire questo formato:
Magazine: {name}, Issue {issue}Ad esempio, con gli input 1984, George Orwell, Nature e 42:
Book: 1984 by George Orwell
Magazine: Nature, Issue 42E con gli input The Rust Book, Steve Klabnik, Science Weekly e 156:
Book: The Rust Book by Steve Klabnik
Magazine: Science Weekly, Issue 156Riceverai quattro input: il titolo del libro, l’autore del libro, il nome della rivista e il numero del fascicolo della rivista (analizza l’ultimo come u32).
Provalo tu
mod catalog;
mod items;
use catalog::CatalogItem;
use items::{Book, Magazine};
fn main() {
// Leggi i dati in input
let mut book_title = String::new();
std::io::stdin().read_line(&mut book_title).expect("Failed to read line");
let book_title = book_title.trim().to_string();
let mut book_author = String::new();
std::io::stdin().read_line(&mut book_author).expect("Failed to read line");
let book_author = book_author.trim().to_string();
let mut magazine_name = String::new();
std::io::stdin().read_line(&mut magazine_name).expect("Failed to read line");
let magazine_name = magazine_name.trim().to_string();
let mut issue_input = String::new();
std::io::stdin().read_line(&mut issue_input).expect("Failed to read line");
let magazine_issue: u32 = issue_input.trim().parse().expect("Failed to parse issue number");
// TODO: Crea un'istanza di Book usando book_title e book_author
// TODO: Crea un'istanza di Magazine usando magazine_name e magazine_issue
// TODO: Chiama description() su ciascun elemento e stampa i risultati
}
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