Funkcje powiązane
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 4 z 61.
Nie wszystkie funkcje w bloku impl muszą działać na istniejącej instancji. Funkcje, które nie przyjmują self jako parametru, nazywane są funkcjami powiązanymi: są powiązane z samym typem, a nie z konkretną instancją.
Najczęstszym zastosowaniem funkcji powiązanych jest tworzenie konstruktorów. Zgodnie z konwencją często nazywa się je new:
struct Player {
name: String,
score: u32,
}
impl Player {
fn new(name: String) -> Player {
Player {
name,
score: 0,
}
}
}
Zwróć uwagę, że nie ma tu parametru self. Ta funkcja nie potrzebuje istniejącego obiektu Player, żeby działać. Zamiast tego tworzy i zwraca zupełnie nowy obiekt. Typem zwracanym jest sama struktura.
Aby wywołać funkcję skojarzoną, użyj składni :: z nazwą typu zamiast notacji kropkowej:
fn main() {
let player1 = Player::new(String::from("Alice"));
println!("{} starts with {} points", player1.name, player1.score);
// Wynik: Alice starts with 0 points
}
Ten wzorzec zapewnia przejrzysty sposób inicjalizowania struktur wartościami domyślnymi lub logiką walidacji, dzięki czemu logika tworzenia pozostaje powiązana z definicją typu. Prawdopodobnie widziałeś już tę składnię w przypadku String::from() — to również funkcja skojarzona!
Wyzwanie
ŁatwyUtwórz strukturę Book z dwoma polami: title (String) i pages (u32).
Dodaj blok implementacji dla Book z funkcją skojarzoną o nazwie new, która:
- Przyjmuje parametr
title: String - Zwraca nowy obiekt
Bookz podanym tytułem i polempagesustawionym na0
Dodaj także metodę o nazwie info, która przyjmuje &self i zwraca wartość typu String w formacie: "{title} has {pages} pages"
Otrzymasz jedno wejście:
- Tytuł książki (String)
Użyj funkcji skojarzonej Book::new, aby utworzyć książkę z podanym tytułem, a następnie wypisz wynik wywołania metody info.
Oczekiwany format wyjścia:
{title} has {pages} pagesSpróbuj swoich sił
use std::io;
// TODO: Zdefiniuj strukturę Book z polami title (String) i pages (u32)
// TODO: Dodaj blok impl dla Book zawierający:
// - Funkcję powiązaną `new`, która przyjmuje tytuł i zwraca Book z polem pages ustawionym na 0
// - Metodę `info`, która zwraca String w formacie "{title} has {pages} pages"
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let title = input.trim().to_string();
// TODO: Użyj Book::new, aby utworzyć książkę o podanym tytule
// TODO: Wypisz wynik wywołania metody info
}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