Flächenrechner für Formen
Teil des Abschnitts Object Oriented Programming der Rust-Journey von Coddy. Lektion 61 von 61.
Aufgabe
EinfachDiese abschließende Herausforderung verbindet traits, Trait-Objekte und Polymorphismus, um ein praktisches Problem zu lösen: die Berechnung der gesamten area verschiedener shapes, die in einer einzigen Sammlung gespeichert sind.
Erstellen wir einen Rechner für die area von shapes, der die Leistungsfähigkeit von Trait-Objekten und Polymorphismus demonstriert! Du erstellst ein System, in dem verschiedene shapes, Circle und Square, gemeinsam in einer einzigen Sammlung gespeichert werden können und ihre gesamte area über eine einheitliche Schnittstelle berechnet wird.
Du wirst deinen Code auf drei Dateien verteilen:
shape.rs: Definiere denShape-trait mit einerarea-Methode, die einf64zurückgibt. Dieser trait legt den Vertrag fest, den alle shapes erfüllen müssen.shapes.rs: Erstelle zwei structs, die deinen trait implementieren. EinCirclehat einenradius(f64), und einSquarehat eineside(f64). Jeder struct sollte denShape-trait mit seiner passenden area-Formel implementieren. Verwende für Circle3.14159als π.main.rs: Binde beide Module ein und erstelle einetotal_area-function, die einVec<Box<dyn Shape>>akzeptiert und die Summe aller areas zurückgibt. Erstelle mithilfe der bereitgestellten Eingaben einen Circle und ein Square, speichere sie in einem Vektor von Trait-Objekten, berechne die gesamte area und gib das Ergebnis aus.
Die area-Formeln lauten:
- Circle:
3.14159 × radius × radius - Square:
side × side
Deine Ausgabe sollte die gesamte area aller shapes anzeigen:
Total area: {total}Beispielsweise mit den Eingaben 2.0 (radius des Circle) und 3.0 (side des Square):
Total area: 21.56636Das liegt daran: area des Circle = 3.14159 × 2² = 12.56636, area des Square = 3² = 9, Total = 21.56636
Und mit den Eingaben 1.0 und 4.0:
Total area: 19.14159Du erhältst zwei Eingaben: den radius des Circle und die side-Länge des Square (parse beide als f64).
Probier es selbst
mod shape;
mod shapes;
use shape::Shape;
use shapes::{Circle, Square};
// TODO: Implementiere die total_area Funktion
// Sie sollte einen Vec<Box<dyn Shape>> akzeptieren und die Summe aller Flächen als f64 zurückgeben
fn total_area(shapes: Vec<Box<dyn Shape>>) -> f64 {
// TODO: Berechne und gib die Summe aller Formflächen zurück
0.0
}
fn main() {
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let radius: f64 = input1.trim().parse().expect("Invalid number");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let side: f64 = input2.trim().parse().expect("Invalid number");
// TODO: Erstelle einen Circle mit dem gegebenen Radius
// TODO: Erstelle ein Square mit der gegebenen Seite
// TODO: Speichere beide Formen in einem Vec<Box<dyn Shape>>
// TODO: Rufe total_area auf und gib das Ergebnis im Format aus: "Total area: {total}"
}
Alle Lektionen in Object Oriented Programming
1Methoden und Verhalten
Einführung in ImplementierungsblöckeDer Self-ParameterVeränderliche MethodenAssoziierte FunktionenMehrere ImplementierungsblöckeMethod ChainingRückblick – Rechteck-Aktionen4Projekt: Virtuelles Haustier
Das Haustier definierenDas Haustier füttern7Standard-Traits
Das Debug-TraitDas Display-TraitClone und CopyGleichheits-TraitsZusammenfassung – Druckbarer Punkt10Projekt: Dokumentensystem
Das Draw-TraitText-Komponente2Kapselung und Module
Grundlagen der ModuleDas Public-SchlüsselwortPrivate FelderGetterSetterWiederholung – Sicherer Tresor5Generics
Generische StructsGenerische MethodenMehrere generische TypenGenerische FunktionenZusammenfassung - Koordinatenpunkt8Traits als Einschränkungen
Syntax für Trait BoundsMehrfache BoundsDie Where-KlauselTypen mit Traits zurückgebenRückblick – Generischer Drucker11Design Patterns in Rust
Newtype-PatternKompositionDas Drop-TraitFrom und IntoZusammenfassung – Smart Pointer Mock3Fortgeschrittene Enums
Enums mit DatenMethoden für EnumsMatching von DatenvariantenDas Option-Enum erneut betrachtetZusammenfassung – Shape-Enum6Definition von Traits
Was ist ein Trait?Traits implementierenStandardimplementierungenStandardimplementierungen überschreibenTraits mit ParameternZusammenfassung – Media PlayerÜbe selbstständig: Online-Rust-Compiler