Option
Мы уже видели некоторое использование Option<T>. Он хранит либо значение типа T, либо ничего. Например, String::find возвращает Option<usize>.
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn main() {
let name = "Löwe 老虎 Léopard Gepardi";
let mut position: Option<usize> = name.find('é');
dbg!(position);
assert_eq!(position.unwrap(), 14);
position = name.find('Z');
dbg!(position);
assert_eq!(position.expect("Character not found"), 0);
}
-
Optionшироко используется не только в стандартной библиотеке. -
unwrapвернёт значение изOptionили вызовет панику.expectработает похоже, но принимает сообщение об ошибке.- Можно вызвать панику при
None, но нельзя «случайно» забыть проверитьNone. - Когда что-то собирают на скорую руку, часто используют
unwrap/expectповсюду, но рабочий код обычно обрабатываетNoneболее аккуратно.
- Можно вызвать панику при
-
Многие методы
Option, такие какinsertиtake, можно рассматривать как работу с контейнером, в котором есть место не больше чем для одного элемента. Методы с похожими названиями и поведением есть и у других типов-контейнеров. -
«Оптимизация ниш» означает, что
Option<T>обычно имеет тот же размер в памяти, что иT, если существует представление, которое не является допустимым значениемT. Например, ссылка не может быть NULL, поэтомуOption<&T>автоматически использует NULL для представления вариантаNone, и поэтому может храниться в той же памяти, что и&T.