Option

Ми вже бачили деяке використання Option<T>. Це зберігає або значення типу T, або нічого. Наприклад, String::find повертає Option<usize>.

fn main() {
    let name = "Löwe 老虎 Léopard Gepardi";
    let mut position: Option<usize> = name.find('é');
    println!("пошук повернув {position:?}");
    assert_eq!(position.unwrap(), 14);
    position = name.find('Z');
    println!("пошук повернув {position:?}");
    assert_eq!(position.expect("Символ не знайдено"), 0);
}
This slide should take about 10 minutes.
  • Option широко використовуються, і не тільки в стандартній бібліотеці.

  • unwrap поверне значення в Option, або паніку. expect працює аналогічно, але повертає повідомлення про помилку.

    • Ви можете панікувати на None, але ви не можете "випадково" забути перевірити на None.
    • Під час швидкої експерементації зазвичай прийнято використовувати unwrap/expect повсюди, але у виробничому коді None зазвичай обробляється у більш зручному вигляді.
  • "Нішова оптимізація" означає, що Option<T> часто має той самий розмір у пам'яті, що й T, якщо є деяке представлення, яке не є допустимим значенням T. Наприклад, посилання не може бути NULL, тому Option<&T> автоматично використовує NULL для представлення варіанту None, і таким чином може зберігатися у тій самій пам'яті, що й &T.