הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

<p id="Смотрите_также_20"><strong><a l:href="#Смотрите_также_20">Смотрите также:</a></strong></p>

enum, Option, и RFC

<p id="while_let"><strong><a l:href="#while_let">while let</a></strong></p>

Так же, как иif let, while let может сделать неудобный match более терпимым. Рассмотрим следующий пример, в котором мы увеличиваем значение i:

#![allow(unused)]

fn main() {

// Создадим переменную `optional` с типом `Option`

let mut optional = Some(0);

// Неоднократно повторим наш тест.

loop {

match optional {

// Если `optional` деструктурируется, выполним следующий блок.

Some(i) => {

if i > 9 {

println!("Больше 9, уходим отсюда!");

optional = None;

} else {

println!("`i` равен `{:?}`. Попробуем еще раз.", i);

optional = Some(i + 1);

}

// ^ Требует 3 уровня вложенности!

},

// Выходим из цикла в случаи ошибки деструктуризации:

_ => { break; }

// ^ Зачем это нужно? Должен быть способ сделать это лучше!

}

}

}

Использование while let делает этот пример немного приятнее:

fn main() {

// Создадим переменную `optional` с типом `Option`

let mut optional = Some(0);

// Это можно прочитать так: "Пока `let` деструктурирует `optional` в

// `Some(i)`, выполняем блок (`{}`). В противном случае `break`.

while let Some(i) = optional {

if i > 9 {

println!("Больше 9, уходим отсюда!");

optional = None;

} else {

println!("`i` равен `{:?}`. Попробуем ещё раз.", i);

optional = Some(i + 1);

}

// ^ Меньше смещаемся вправо, к тому же

// нет необходимости обрабатывать ошибки.

}

// ^ К `if let` можно добавить дополнительный блок `else`/`else if`

// `while let` подобного нет.

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

<p id="Смотрите_также_21"><strong><a l:href="#Смотрите_также_21">Смотрите также:</a></strong></p>

enum, Option, and the RFC

<p id="Функции"><strong><a l:href="#Функции">Функции</a></strong></p>

Функции объявляются с помощью ключевого слова fn. Их аргументы имеют явно заданный тип, как у переменных, и, если функция возвращает значение, возвращаемый тип должен быть указан после стрелки ->.

Перейти на страницу:

Похожие книги