Podsumowanie – punkt współrzędnych
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 28 z 61.
Wyzwanie
ŁatwyStwórzmy elastyczny układ współrzędnych, który działa z dowolnym typem numerycznym! Utworzysz generyczną strukturę Point, która może reprezentować pozycje za pomocą liczb całkowitych w grach opartych na siatce lub liczb zmiennoprzecinkowych w precyzyjnej grafice — a wszystko to w ramach jednej definicji.
Rozmieścisz swój kod w dwóch plikach:
point.rs: Zdefiniuj publiczną generyczną strukturęPoint<T>z dwoma publicznymi polami:xiy, oba typuT. Zaimplementuj metody dla swojego punktu:- Skojarzoną funkcję
new, która tworzy punkt ze współrzędnych x i y - Metodę
translate, która przyjmuje wartości dx i dy oraz zwraca nowyPointze współrzędnymi przesuniętymi o te wartości (wymaga to, abyTobsługiwał dodawanie i kopiowanie, więc użyj ograniczeniaT: std::ops::Add<Output = T> + Copy)
- Skojarzoną funkcję
main.rs: Zaimportuj moduł punktu i pokaż, jak ta sama generyczna struktura działa bezproblemowo z różnymi typami numerycznymi.
W pliku głównym zaprezentuj swoją generyczną strukturę Point, wykonując następujące czynności:
- Utwórz punkt całkowitoliczbowy, używając dwóch pierwszych danych wejściowych (parsowanych jako
i32) - Przesuń go o trzecią i czwartą daną wejściową (również typu
i32) - Utwórz punkt zmiennoprzecinkowy, używając piątej i szóstej danej wejściowej (parsowanych jako
f64) - Wyświetl wszystkie trzy punkty
Wynik powinien mieć następujący format:
Integer point: ({x}, {y})
After translation: ({x}, {y})
Float point: ({x}, {y})Na przykład dla danych wejściowych 3, 5, 2, -1, 1.5 i 2.5:
Integer point: (3, 5)
After translation: (5, 4)
Float point: (1.5, 2.5)Zwróć uwagę, że Point::new(3, 5) tworzy Point<i32>, podczas gdy Point::new(1.5, 2.5) tworzy Point<f64>: ta sama definicja struktury dostosowuje się do obu typów!
Otrzymasz sześć danych wejściowych: dwie liczby całkowite dla pierwszego punktu, dwie liczby całkowite do przesunięcia oraz dwie liczby zmiennoprzecinkowe dla drugiego punktu.
Spróbuj swoich sił
mod point;
use point::Point;
fn main() {
// Odczytaj dane wejściowe
let mut input = String::new();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let x1: i32 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let y1: i32 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let dx: i32 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let dy: i32 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let x2: f64 = input.trim().parse().expect("Invalid input");
input.clear();
std::io::stdin().read_line(&mut input).expect("Failed to read line");
let y2: f64 = input.trim().parse().expect("Invalid input");
// TODO: Utwórz punkt o współrzędnych całkowitych, używając x1 i y1
// TODO: Przesuń punkt o współrzędnych całkowitych o dx i dy
// TODO: Utwórz punkt o współrzędnych zmiennoprzecinkowych, używając x2 i y2
// TODO: Wypisz wyniki w wymaganym formacie:
// println!("Integer point: ({}, {})", ...);
// println!("After translation: ({}, {})", ...);
// println!("Float point: ({}, {})", ...);
}
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