Łańcuchowe wywoływanie metod
Część sekcji Programowanie obiektowe ścieżki Rust w Coddy. Lekcja 6 z 61.
Jak dotąd nasze metody modyfikujące zmieniały strukturę i niczego nie zwracały. Ale co, jeśli chcemy wywołać kilka metod jedna po drugiej na tej samej instancji? Zwracając referencję do self, umożliwiamy łączenie metod: wzorzec, w którym wiele wywołań metod łączy się w jedno wyrażenie.
Kluczem jest to, aby metody &mut self zwracały &mut Self:
struct Config {
debug: bool,
timeout: u32,
}
impl Config {
fn new() -> Config {
Config { debug: false, timeout: 30 }
}
fn set_debug(&mut self, value: bool) -> &mut Self {
self.debug = value;
self
}
fn set_timeout(&mut self, seconds: u32) -> &mut Self {
self.timeout = seconds;
self
}
}
Każda metoda modyfikuje strukturę, a następnie zwraca self: mutowalne odwołanie do tej samej instancji. Dzięki temu następne wywołanie metody może od razu kontynuować pracę na niej:
fn main() {
let mut config = Config::new();
config.set_debug(true).set_timeout(60);
println!("Debug: {}, Timeout: {}", config.debug, config.timeout);
// Wynik: Debug: true, Timeout: 60
}
Zamiast pisać trzy osobne instrukcje, konfigurujemy wszystko w jednym płynnym wierszu. Ten wzorzec „w stylu kreatora” jest szczególnie przydatny podczas konfigurowania obiektów z wieloma opcjonalnymi ustawieniami, dzięki czemu kod jest bardziej zwięzły i czytelny.
Wyzwanie
ŁatwyUtwórz strukturę TextStyle z trzema polami: bold (bool), italic (bool) i size (u32).
Dodaj blok implementacji dla TextStyle z następującymi elementami:
new: funkcja skojarzona, która zwracaTextStylez polemboldustawionym nafalse, polemitalicustawionym nafalsei polemsizeustawionym na12set_bold: przyjmuje&mut selfi wartość typubool, ustawia pole bold i zwraca&mut Self, aby umożliwić łączenie metodset_italic: przyjmuje&mut selfi wartość typubool, ustawia pole italic i zwraca&mut Self, aby umożliwić łączenie metodset_size: przyjmuje&mut selfi wartość typuu32, ustawia pole size i zwraca&mut Self, aby umożliwić łączenie metod
Otrzymasz trzy dane wejściowe:
- Pierwszy wiersz: ustawienie bold (
truelubfalse) - Drugi wiersz: ustawienie italic (
truelubfalse) - Trzeci wiersz: rozmiar czcionki (u32)
Utwórz mutowalny obiekt TextStyle za pomocą new, a następnie użyj łączenia metod, aby zastosować wszystkie trzy ustawienia w jednym wyrażeniu. Wypisz końcowy stan w formacie pokazanym poniżej.
Oczekiwany format wyjścia:
Bold: {bold}, Italic: {italic}, Size: {size}Spróbuj swoich sił
use std::io;
// TODO: Zdefiniuj tutaj strukturę TextStyle
// TODO: Dodaj blok implementacji dla TextStyle zawierający:
// - funkcję powiązaną new()
// - metodę set_bold()
// - metodę set_italic()
// - metodę set_size()
fn main() {
let mut input = String::new();
// Odczytaj ustawienie pogrubienia
io::stdin().read_line(&mut input).expect("Failed to read line");
let bold: bool = input.trim().parse().expect("Invalid bool");
input.clear();
// Odczytaj ustawienie kursywy
io::stdin().read_line(&mut input).expect("Failed to read line");
let italic: bool = input.trim().parse().expect("Invalid bool");
input.clear();
// Odczytaj ustawienie rozmiaru
io::stdin().read_line(&mut input).expect("Failed to read line");
let size: u32 = input.trim().parse().expect("Invalid u32");
// TODO: Utwórz modyfikowalny obiekt TextStyle za pomocą new(), a następnie połącz wywołania metod
// aby zastosować wszystkie trzy ustawienia w jednym wyrażeniu
// TODO: Wypisz wynik w formacie: Bold: {bold}, Italic: {italic}, Size: {size}
}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