Когда мы не уверены, существует ли символна 6-м элементе, и вы не хотите, чтобы ваша программа вылетала, Option
приходит на помощь.Вот еще один пример из Rust Programming Language :
fn plus_one(x: Option<i32>) -> Option<i32> {
match x {
None => None,
Some(i) => Some(i + 1),
}
}
let five = Some(5);
let six = plus_one(five);
let none = plus_one(None);
Листинг 6-5: Функция, которая использует выражение match
дляOption<i32>
Давайте рассмотрим первое выполнение plus_one
более подробно.Когда мы вызываем plus_one(five)
, переменная x
в теле plus_one
будет иметь значение Some(5)
.Затем мы сравниваем это с каждым плечом матча.
None => None,
Значение Some(5)
не соответствует шаблону None
, поэтому мы переходим к следующему плечу.
Some(i) => Some(i + 1),
Some(5)
соответствует Some(i)
?Почему да, это так!У нас такой же вариант.i
привязывается к значению, содержащемуся в Some
, поэтому i
принимает значение 5
.Затем выполняется код в ответвлении, поэтому мы добавляем 1 к значению i
и создаем новое значение Some
с нашим общим 6
внутри.
Теперь давайте рассмотрим второй вызовplus_one
в листинге 6-5, где x
равно None
.Вводим match
и сравниваем с первым рычагом.
None => None,
Соответствует!Нет значения для добавления, поэтому программа останавливается и возвращает значение None
справа от =>
.Поскольку первая рука совпадает, никакие другие руки не сравниваются.
Объединение match
и перечислений полезно во многих ситуациях.Вы часто увидите этот шаблон в коде Rust: match
для перечисления, свяжите переменную с данными внутри, а затем выполните код на его основе.Сначала это немного сложно, но как только вы к этому привыкнете, вам захочется, чтобы оно было на всех языках.Это неизменно любимый пользователь.