Parametr self
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 2 z 61.
Gdy metoda musi uzyskać dostęp do danych przechowywanych w instancji struktury, używa parametru &self. Ten specjalny parametr jest zawsze pierwszym argumentem metody i reprezentuje referencję do instancji, na której wywołano metodę.
Symbol & oznacza, że pożyczamy instancję, zamiast przejmować nad nią własność. Dzięki temu metoda może odczytywać pola struktury bez zużywania instancji:
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
fn is_square(&self) -> bool {
self.width == self.height
}
}
Wewnątrz ciała metody self daje ci dostęp do wszystkich pól struktury za pomocą notacji kropkowej. Metoda area odczytuje zarówno width, jak i height, aby obliczyć i zwrócić wynik.
Ponieważ &self jedynie pożycza instancję, możesz bez problemu wywołać kilka metod tej samej struktury:
fn main() {
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
}
Metody korzystające z &self są tylko do odczytu. Mogą analizować dane struktury, ale nie mogą ich zmieniać. W następnej lekcji dowiesz się, jak tworzyć metody, które mogą modyfikować instancję.
Wyzwanie
ŁatwyUtwórz strukturę Circle z jednym polem: radius (f64).
Dodaj blok implementacji dla Circle z dwiema metodami, które używają &self:
circumference: zwraca obwód jakof64(wzór:2.0 * 3.14159 * radius)diameter: zwraca średnicę jakof64(wzór:2.0 * radius)
Otrzymasz jedno wejście:
- Promień okręgu (
f64)
Utwórz instancję Circle z podanym promieniem, a następnie wypisz obwód i średnicę w osobnych wierszach.
Oczekiwany format wyjściowy:
{circumference}
{diameter}Spróbuj swoich sił
use std::io;
// TODO: Zdefiniuj tutaj strukturę Circle
// TODO: Dodaj blok implementacji dla Circle z metodami obliczającymi obwód i średnicę
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let radius: f64 = input.trim().parse().expect("Invalid number");
// TODO: Utwórz instancję Circle i wypisz obwód oraz średnicę
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
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