Riepilogo - enumerazione Shape
Fa parte della sezione Programmazione orientata agli oggetti del percorso Rust di Coddy. Lezione 18 di 61.
Sfida
FacileCostruiamo un calcolatore geometrico che usa un enum per rappresentare diverse forme, ognuna delle quali memorizza le proprie dimensioni. Il tuo enum Shape mostrerà come un singolo tipo possa contenere strutture di dati diverse e fornire un comportamento uniforme tramite i metodi.
Creerai due file per organizzare il codice:
shape.rs: definisci un enum pubblicoShapecon due varianti:Circle: contiene un singolof64che rappresenta il raggio (sintassi a tupla)Rectangle: contiene campi con nome:width(f64) eheight(f64)
areache usa il pattern matching per calcolare l’area corretta in base alla variante. Per i cerchi, usa3.14159come π.main.rs: importa il modulo delle forme, crea un’istanza di ciascuna variante della forma usando gli input forniti e stampa l’area di ciascuna forma.
Il tuo metodo area dovrebbe restituire un f64. Durante il matching, destruttura ciascuna variante per estrarne le dimensioni e applicare la formula appropriata:
- Area del cerchio:
π × radius² - Area del rettangolo:
width × height
L’output dovrebbe mostrare l’area di ciascuna forma su una riga a sé, con esattamente una cifra decimale:
Circle area: {area}
Rectangle area: {area}Per esempio, con un raggio del cerchio di 5.0 e un rettangolo con larghezza 4.0 e altezza 6.0, l’output sarebbe:
Circle area: 78.5
Rectangle area: 24.0Riceverai tre input: il raggio del cerchio, la larghezza del rettangolo e l’altezza del rettangolo.
Provalo tu
mod shape;
use shape::Shape;
fn main() {
// Leggi gli input
let mut radius_input = String::new();
std::io::stdin().read_line(&mut radius_input).expect("Failed to read line");
let radius: f64 = radius_input.trim().parse().expect("Invalid number");
let mut width_input = String::new();
std::io::stdin().read_line(&mut width_input).expect("Failed to read line");
let width: f64 = width_input.trim().parse().expect("Invalid number");
let mut height_input = String::new();
std::io::stdin().read_line(&mut height_input).expect("Failed to read line");
let height: f64 = height_input.trim().parse().expect("Invalid number");
// TODO: Crea una forma Circle usando radius
// TODO: Crea una forma Rectangle usando width e height
// TODO: Stampa l'area di ogni forma con una cifra decimale
// Formato: "Circle area: {area}" e "Rectangle area: {area}"
}
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