Wiele języków programowania pozwala na użycie wartości null, co prowadzi do błędów dereferencji wskaźnika null w czasie wykonywania. W Rust do wyraźnego przedstawienia wartości opcjonalnych wprowadzono uniwersalny typ Option<T>, który zapewnia bezpieczeństwo i, co ważne, zmusza do rozważenia przypadku braku wartości.
Brak wartości (na przykład, gdy wynik wyszukiwania nie zostanie znaleziony) często prowadzi do błędów w czasie wykonywania, jeśli nie jest to odzwierciedlone w typie. Bezpieczne i wyraźne zarządzanie przypadkiem pustej wartości zmniejsza liczbę błędów.
Typ Option<T> jest zrealizowany jako enum z dwoma wariantami: Some(T) (wartość obecna) i None (wartość brakująca). To pozwala kompilatorowi zmusić programistę do uwzględnienia obu przypadków. Jakiekolwiek użycie wartości opcjonalnej bez wyraźnego sprawdzenia prowadzi do błędu kompilacji.
Przykład kodu:
fn divide(a: i32, b: i32) -> Option<i32> { if b == 0 { None } else { Some(a / b) } } let res = divide(6, 3); match res { Some(result) => println!("Wynik: {}", result), None => println!("Dzielenie przez zero!"), }
Kluczowe cechy:
Czy Option<T> jest zero-cost abstrakcją, czy każda zmienna Option zajmuje więcej miejsca?
Tak, w większości przypadków Option<T> jest zero-cost, gdy typ T nie może przyjmować "nullowej" wartości (na przykład, typ referencyjny lub Box<T>). Rust używa optymalizacji "nullable pointer optimization", więc dodatkowa pamięć nie jest potrzebna.
let value: Option<&u32> = None; // Nie zajmuje więcej miejsca niż zwykła referencja.
Czy można używać unwrap bez obaw?
Nie, unwrap() prowadzi do paniki przy wartości None. Należy go używać tylko wtedy, gdy ma się pewność, że wartość jest obecna, lub woleć metody unwrap_or, unwrap_or_else lub dopasowywanie wzorców.
Czym różni się Option od referencji (&T, Option<&T>)?
Referencja zawsze wskazuje na istniejącą wartość. Jeśli wartość jest nieobecna, należy użyć Option<&T>, aby wyraźnie odzwierciedlić "może być nic". Użycie Option zamiast bezpośredniej referencji zapobiega wyścigom o wskaźnik null.
Funkcja zwraca wynik wyszukiwania przez Option, ale wywołujący kod używa unwrap, pewny, że zawsze jest wynik. W rzeczywistości, przy braku wartości program pada w produkcji.
Zalety:
Wady:
Kod używa match do obsługi Option, wszystkie przypadki są wyraźnie udokumentowane i objęte testami.
Zalety:
Wady: