Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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);
}
This slide should take about 10 minutes.
  • Option широко используется не только в стандартной библиотеке.

  • unwrap вернёт значение из Option или вызовет панику. expect работает похоже, но принимает сообщение об ошибке.

    • Можно вызвать панику при None, но нельзя «случайно» забыть проверить None.
    • Когда что-то собирают на скорую руку, часто используют unwrap/expect повсюду, но рабочий код обычно обрабатывает None более аккуратно.
  • Многие методы Option, такие как insert и take, можно рассматривать как работу с контейнером, в котором есть место не больше чем для одного элемента. Методы с похожими названиями и поведением есть и у других типов-контейнеров.

  • «Оптимизация ниш» означает, что Option<T> обычно имеет тот же размер в памяти, что и T, если существует представление, которое не является допустимым значением T. Например, ссылка не может быть NULL, поэтому Option<&T> автоматически использует NULL для представления варианта None, и поэтому может храниться в той же памяти, что и &T.