Podsumowanie — atrapowy inteligentny wskaźnik
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 58 z 61.
Wyzwanie
ŁatwyZbudujmy atrapę inteligentnego wskaźnika o nazwie SmartBox, która pokaże, jak działają pod maską rzeczywiste inteligentne wskaźniki w Rust! Twój wrapper będzie generyczny, zapewni dostęp do swojej wewnętrznej wartości i automatycznie poinformuje o usuwaniu.
Rozmieścisz kod w dwóch plikach:
smart_box.rs: Zdefiniuj publiczną generyczną strukturęSmartBox<T>z jednym polemvaluetypuT. Zaimplementuj funkcję asocjowanąnew, która tworzy obiekt SmartBox i wyświetla komunikat o utworzeniu. Dodaj metodęget, która zwraca referencję do wewnętrznej wartości. Na koniec zaimplementuj cechęDrop, aby wyświetlała komunikat o usuwaniu, gdy obiekt SmartBox wyjdzie poza zakres.main.rs: Włącz moduł smart_box i pokaż działanie SmartBox z dwoma różnymi typami. UtwórzSmartBox<i32>przechowujący liczbę orazSmartBox<String>przechowujący tekst (oba na podstawie podanych danych wejściowych). Wyświetl wartości za pomocą metodyget. Komunikaty Drop pojawią się automatycznie, gdy obiekty wyjdą poza zakres na końcu funkcji main.
Po utworzeniu obiektu SmartBox powinien on wyświetlić:
SmartBox createdPodczas uzyskiwania dostępu do wartości wyświetl ją w tym formacie:
Value: {value}Po usunięciu obiektu SmartBox powinien on wyświetlić:
SmartBox droppedNa przykład dla danych wejściowych 42 i Hello:
SmartBox created
SmartBox created
Value: 42
Value: Hello
SmartBox dropped
SmartBox droppedZauważ, że najpierw tworzone są oba obiekty, potem uzyskiwany jest dostęp do ich wartości, a na końcu, gdy kończy się funkcja main, oba są usuwane w odwrotnej kolejności (ostatni utworzony, pierwszy usunięty).
Otrzymasz dwa dane wejściowe: wartość całkowitą (parsowaną jako i32) oraz wartość tekstową.
Spróbuj swoich sił
mod smart_box;
use smart_box::SmartBox;
fn main() {
// Odczytaj dane wejściowe
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let number: i32 = input1.trim().parse().expect("Failed to parse number");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let text = input2.trim().to_string();
// TODO: Utwórz SmartBox<i32> przechowujący liczbę
// TODO: Utwórz SmartBox<String> przechowujący tekst
// TODO: Wypisz wartości, używając metody get
// Format: "Value: {value}"
// Komunikaty Drop pojawią się automatycznie po zakończeniu main
}
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