Menu
Coddy logo textTech

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!

challenge icon

Wyzwanie

Łatwy

Utwó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 Book z podanym tytułem i polem pages ustawionym na 0

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} pages

Spró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
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Rust online