Podsumowanie — typ wyliczeniowy Shape
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 18 z 61.
Wyzwanie
ŁatwyZbudujmy kalkulator geometrii, który używa typu wyliczeniowego do reprezentowania różnych kształtów, z których każdy przechowuje własne wymiary. Typ wyliczeniowy Shape pokaże, jak jeden typ może przechowywać różne struktury danych i zapewniać wspólne zachowanie za pomocą metod.
Utworzysz dwa pliki, aby uporządkować kod:
shape.rs: Zdefiniuj publiczny typ wyliczeniowyShapez dwoma wariantami:Circle: przechowuje pojedynczą wartośćf64reprezentującą promień (składnia krotkowa)Rectangle: przechowuje nazwane pola:width(f64) iheight(f64)
area, która używa dopasowywania wzorców, aby obliczyć odpowiednie pole na podstawie wariantu. Dla okręgów użyj3.14159jako π.main.rs: Dołącz moduł kształtów, utwórz po jednej instancji każdego wariantu kształtu, używając podanych danych wejściowych, i wypisz pole każdego kształtu.
Metoda area powinna zwracać wartość typu f64. Podczas dopasowywania rozpakuj każdy wariant, aby wyodrębnić jego wymiary, i zastosuj odpowiedni wzór:
- Pole okręgu:
π × radius² - Pole prostokąta:
width × height
Wynik powinien wyświetlać pole każdego kształtu w osobnym wierszu, z dokładnością do jednego miejsca po przecinku:
Circle area: {area}
Rectangle area: {area}Na przykład dla okręgu o promieniu 5.0 i prostokąta o szerokości 4.0 oraz wysokości 6.0 wynik będzie następujący:
Circle area: 78.5
Rectangle area: 24.0Otrzymasz trzy dane wejściowe: promień okręgu, szerokość prostokąta i wysokość prostokąta.
Spróbuj swoich sił
mod shape;
use shape::Shape;
fn main() {
// Wczytaj dane wejściowe
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: Utwórz figurę Circle, używając promienia
// TODO: Utwórz figurę Rectangle, używając szerokości i wysokości
// TODO: Wypisz pole każdej figury z jednym miejscem po przecinku
// Format: "Circle area: {area}" i "Rectangle area: {area}"
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Metody i zachowanie
Wprowadzenie do bloków implementacjiParametr selfMetody modyfikująceFunkcje powiązaneWiele bloków implementacjiŁańcuchowe wywoływanie metodPowtórzenie — działania na prostokącie4Projekt: Wirtualne zwierzątko
Definiowanie zwierzątkaKarmienie zwierzątka7Standardowe cechy
Cecha DebugCecha DisplayClone i CopyCechy równościPowtórka – punkt do wydrukowania10Projekt: System dokumentów
Trait DrawKomponent tekstowy2Hermetyzacja i moduły
Podstawy modułówSłowo kluczowe publicPola prywatneGetterySetteryPodsumowanie — bezpieczna skrytka5Typy generyczne
Struktury generyczneMetody generyczneWiele typów generycznychFunkcje generycznePodsumowanie – punkt współrzędnych8Cechy jako ograniczenia
Składnia ograniczeń cechWiele ograniczeńKlauzula whereZwracanie typów z użyciem cechPodsumowanie — generyczna drukarka11Wzorce projektowe w Rust
Wzorzec NewtypeKompozycjaTrait DropFrom i IntoPodsumowanie — atrapowy inteligentny wskaźnik3Zaawansowane typy wyliczeniowe
Typy wyliczeniowe z danymiMetody typów wyliczeniowychDopasowywanie wariantów danychTyp wyliczeniowy Option — powtórzeniePodsumowanie — typ wyliczeniowy Shape6Definiowanie cech
Czym jest cecha?Implementowanie cechImplementacje domyślneNadpisywanie wartości domyślnychCechy z parametramiPowtórzenie — odtwarzacz multimedialnyPoćwicz samodzielnie: Kompilator Rust online