Używanie „match” z „Option”
Część sekcji Logika i przepływ programu ścieżki Rust w Coddy. Lekcja 36 z 66.
Skoro już wiesz, czym jest Option, poznajmy najpopularniejszy i najbardziej jawny sposób obsługi tego typu: użycie wyrażenia match. To podejście wymaga rozważenia obu możliwych przypadków — gdy wartość istnieje i gdy jej nie ma.
Wyrażenie match doskonale współpracuje z Option, ponieważ możesz utworzyć ramiona dla obu wariantów:
let maybe_name = Some("Alice".to_string());
match maybe_name {
Some(name) => println!("Hello, {}!", name),
None => println!("Hello, stranger!"),
}Zwróć uwagę, jak gałąź Some(name) wyodrębnia wartość z wariantu Some. Zmienna name zawiera teraz właściwy String, a nie Option. Nazywa się to destrukturyzacją — wyciągasz wewnętrzną wartość z opakowania.
Gałąź None obsługuje przypadek, w którym nie ma żadnej wartości, umożliwiając podanie alternatywnego zachowania, takiego jak wyświetlenie domyślnego komunikatu lub wykonanie zupełnie innego działania.
Wyzwanie
ŁatwyOtrzymasz imię ucznia jako dane wejściowe. Imię może być obecne w systemie albo może go brakować. Utwórz Option<String>, które zawiera Some(name), jeśli imię nie jest puste, lub None, jeśli imię jest puste. Użyj wyrażenia match, aby obsłużyć oba przypadki i wypisać odpowiedni komunikat.
Wymagania:
- Wczytaj dane wejściowe jako ciąg znaków (imię ucznia)
- Usuń białe znaki z danych wejściowych za pomocą
.trim() - Utwórz zmienną typu
Option<String>:- Jeśli przycięte imię nie jest puste, przypisz
Some(name.to_string()) - Jeśli przycięte imię jest puste, przypisz
None
- Jeśli przycięte imię nie jest puste, przypisz
- Użyj wyrażenia
match, aby obsłużyć oba warianty typuOption - W ramieniu
Some(name)wypisz:Welcome, [name]! - W ramieniu
Nonewypisz:No name provided
Dane wejściowe:
- Pojedynczy wiersz zawierający imię ucznia albo pusty wiersz
Wyjście:
- Jeśli podano imię:
Welcome, [name]! - Jeśli nie podano imienia (puste dane wejściowe):
No name provided
Spróbuj swoich sił
use std::io;
fn main() {
// Odczytaj dane wejściowe
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let name = input.trim();
// TODO: Utwórz Option<String> w zależności od tego, czy name jest puste
// TODO: Użyj wyrażenia match do obsługi przypadków Some i None oraz wypisz odpowiedni komunikat
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ programu
1Zaawansowane sterowanie przepływem
Wyrażenie „match”Dopasowywanie wielu wartościDopasowywanie zakresówWyrażenie „if let”Pętle jako wyrażeniaPodsumowanie — prosty parser poleceń4Grupowanie danych za pomocą struktur
Czym jest struktura?Przegląd strukturDostęp do pól strukturyModyfikowalne strukturyStruktury jako parametry funkcjiStruktury krotkowePodsumowanie — utwórz strukturę Book2Wprowadzenie do wektorów
Czym jest wektor?Tworzenie wektoraDodawanie elementów za pomocą pushDostęp do elementów wektoraIterowanie po wektorzeIterowanie z możliwością modyfikacjiUsuwanie elementówPodsumowanie — prosty licznik punktów5Pary klucz–wartość z mapami hashującymi
Czym jest mapa haszująca?Tworzenie mapy haszującejWstawianie par klucz–wartośćDostęp do wartościIterowanie po mapie haszującejAktualizowanie wartościUsuwanie paryPodsumowanie – licznik słów8Projekt: Prosty system inwentaryzacji
Konfiguracja projektuDodawanie produktuSprawdzanie stanu magazynowegoSprzedaż produktuŁączenie wszystkiego w całość3Lista zadań w wierszu poleceń
Konfiguracja projektuDodawanie zadaniaWyświetlanie wszystkich zadańUsuwanie zadaniaKońcowy kod6Obsługa braku wartości za pomocą „Option”
Czym jest „Option”?Używanie „match” z „Option”is_some() i is_none()Rozpakowywanie „Option”Metoda expectPodawanie wartości domyślnej: unwrap_orPodsumowanie – znajdowanie elementuPoćwicz samodzielnie: Kompilator Rust online