Найти в Дзене
Coding Corner

Работа с перечислением Option в Rust

Всем привет! У меня уже была подобная статья для языка Swift. И теперь похожая статья к языку Rust. Так что если хотите быть как этот парень с обложки - милости просим :) Сегодня мы поговорим о работе с null, nil, нулевой указатель. Или как вашей душе ближе :) Вкратце - значение, которое не содержит никакого значения. В языке Rust нет этого понятия. Есть перечисление Option, которое позволяет работать с ним достаточно удобно. Вот как оно выглядит : enum Option<T> { Some(T) // Если значение существует. None // Если значение нулевое. } Давайте разберем небольшие примеры кода : let number : Option<u8> = Some(100); Здесь мы создали переменную, определили ей тип Option. Внутри обобщения указали тип, который будет представлен далее и передали значение. let nothing : Option<u8> = None; Здесь мы создали переменную с нулевым значением Как раскрывать значения внутри Option? Язык Rust предлагает нам несколько разных вариантов. Каждый из них по своему удобный, какой использовать - решать ва
Оглавление

Всем привет!

У меня уже была подобная статья для языка Swift. И теперь похожая статья к языку Rust. Так что если хотите быть как этот парень с обложки - милости просим :)

Работа с Optional значениями в Swift
Coding Corner23 июля 2023

Сегодня мы поговорим о работе с null, nil, нулевой указатель. Или как вашей душе ближе :) Вкратце - значение, которое не содержит никакого значения.

В языке Rust нет этого понятия. Есть перечисление Option, которое позволяет работать с ним достаточно удобно.

Вот как оно выглядит :

enum Option<T> {

Some(T) // Если значение существует.

None // Если значение нулевое.

}

Давайте разберем небольшие примеры кода :

let number : Option<u8> = Some(100);

Здесь мы создали переменную, определили ей тип Option. Внутри обобщения указали тип, который будет представлен далее и передали значение.

let nothing : Option<u8> = None;

Здесь мы создали переменную с нулевым значением

Как раскрывать значения внутри Option?

Язык Rust предлагает нам несколько разных вариантов. Каждый из них по своему удобный, какой использовать - решать вам.

1. unwrap()

Самый грубый способ, его можно использовать только когда вы на 120% уверены, что переданное значение не будет нулевым.

Примеры кода :

let number : Option<u8> = Some(100);

println!("{}", number.unwrap())

Здесь вы точно знаете, что значение не нулевое и его можно раскрывать. Если заместо Some(100) будет написано None - программа прервется, будет вызвана паника.

2. expect()

Один из моих любимых способов, потому что действительно очень удобный. Практически как unwrap(), так же разворачивает значение но с одним различием. Внутри скобок вы пишете свой комментарий. Если происходит ошибка при раскрытии - вы сразу видите информацию, которую написали до этого. Позволяет очень быстро ориентироваться если что-то пошло не так. Ну только если вы не везде пишете .expect("error!") :D. Я обычно в этом поле дописываю чуть детально какая операция происходила, вроде "Data parsing was failed".

Примеры кода :

let null_value : Option<u8> = None;

println!("{}", null_value.expect("Print out error! Value = null"))

Все что написано внутри скобок expect() выведется в консоль, так как при развороте null_value было обнаружено нулевое значение, которое мы сами задали.

3. match {}

Самый долгий, при этом максимально разборчивый и информативный. При его использовании мы можем максимально точно разобрать каждую деталь и управлять потоком в зависимости от результата. Из минусов - занимает много места в коде. И не думаю, что имеет смысл его использовать на простых операциях. Потому что расписывать его достаточно долго. Непросто устоять перед соблазном использовать unwrap() или expect() :D

Примеры кода :

let new_value : Option<u16> = Some(666);

match new_value {

None => println!("Value contains null!"),

Some(number) => println!("The number is {}", number),

}

В этом примере с помощью match мы перебрали все возможные варианты для перечисления Option - (Some, None). И для каждого подобрали определенный порядок действий. Если нужно детально разобрать каждый шаг - вам нужен именно этот подход. Если нет - unwrap(), expect() вам вполне хватит.

Благодарю за внимание!