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
.