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);
}
-
Optionшироко використовуються, і не тільки в стандартній бібліотеці. -
unwrapповерне значення вOption, або паніку.expectпрацює аналогічно, але повертає повідомлення про помилку.- Ви можете панікувати на None, але ви не можете “випадково” забути перевірити на None.
- Під час швидкої експерементації зазвичай прийнято використовувати
unwrap/expectповсюди, але у виробничому кодіNoneзазвичай обробляється у більш зручному вигляді.
-
“Нішова оптимізація” означає, що
Option<T>часто має той самий розмір у пам’яті, що йT, якщо є деяке представлення, яке не є допустимим значенням T. Наприклад, посилання не може бути NULL, томуOption<&T>автоматично використовує NULL для представлення варіантуNone, і таким чином може зберігатися у тій самій пам’яті, що й&T.