Перейти к содержанию

Раскройте магию Rust - освоите if-let, while-let и let-else с помощью забавных и увлекательных примеров

Posted on:12 апреля 2023 г. at 13:32

Example Dynamic OG Image link Погружаясь в волшебный мир if-let, while-let и let-else, мы откроем для себя мощь и элегантность возможностей Rust по сопоставлению шаблонов. В этой статье мы рассмотрим, как эти три функции могут помочь вам упростить ваш код и сделать его более читаемым и ремонтопригодным. Вы узнаете, как это сделать: на простых, понятных для детей примерах.

  1. Используйте if-let для изящной обработки необязательных значений, позволяет вам выполнять действия со значениями, когда они доступны, и с легкостью отбрасывать пустые значения.
  2. Раскройте потенциал while-let для многократного выполнения действий со значениями внутри контейнеров, таких как мешочек или коробка, останавливаясь только тогда, когда контейнер пуст.
  3. Используйте let-else для привязки переменных, когда шаблон совпадает, или для отклонения с помощью таких действий, как прерывание, возврат или паника, когда шаблон не совпадает.

К концу этой статьи у вас будет четкое представление об этих трех мощных команд Rust, которые откроют новые возможности в вашем коде и сделают вас более эффективным и уверенным в себе программистом Rust.

if-let

Давайте представим, что у нас есть волшебная шкатулка, в которой иногда находится игрушка, а иногда она пуста. Мы хотим проверить, есть ли внутри игрушка, и поиграть с ней, но мы не хотим ничего делать, если коробка пуста.

В Rust мы используем if-let для выполнения подобных действий. Это позволяет нам проверить, есть ли что-то внутри “коробки” (называемой Option), и сделать что-то с этим, только если там что то есть.

Допустим, у нас есть волшебная шкатулка под названием my_magical_box:

let my_magical_box = Some("игрушка");

Мы можем использовать if-let, чтобы проверить, есть ли внутри игрушка, и поиграть с ней:

if let Some(toy) = my_magical_box {
    println!("Ура! Внутри коробки есть {}! Давайте играть!", toy);
}

Если игрушка есть, мы увидим следующее сообщение: “Ура! Внутри коробки есть игрушка! Давайте играть!” Однако, если там ничего нет, мы не увидим никакого сообщения.

Теперь посмотрим на другой пример. Предположим, у нас есть волшебная корзина с фруктами, которая может либо содержать фрукт, либо быть пустой:

let magical_fruit_basket = Some("яблоко");

Посмотрим, есть ли там фрукт: “Вкуснятина! Мы обнаружили яблоко! Давайте съедим!” Однако, если она пуста, мы не увидим этого сообщения.

if let Some(fruit) = magical_fruit_basket {
    println!("Вкуснятина! Мы обнаружили {}! Давайте съедим!", fruit);
} else {
    println!("О, нет! Корзина с фруктами пуста. Давайте найдем плоды!");
}

Если корзина пуста, мы услышим: “О, нет! Корзина с фруктами пуста. Давайте найдем плоды!”

Вот так работает if-let в Rust! Это позволяет нам проверить, находится ли что-то внутри “коробки”, и делать что-то с ним только в том случае, если внутри есть значение. Когда поле пусто, мы можем использовать else, чтобы что-то сделать.

while-let

Давайте поговорим о ключевом слове while-let в Rust, как если бы это была история. Предположим, у вас есть пакет с конфетами, и вы хотите доставать их одну за другой, пока пакет не опустеет.

В Rust мы используем while-let для достижения этой цели. Это позволяет нам продолжать что-то делать со значениями, содержащимися в “пакете” (называемом Option), пока пакет не опустеет.

Вот простой пример. Предположим, у нас есть волшебный пакетик для конфет с именем my_magical_candy_bag:

let mut my_magical_candy_bag = Some(5);

Это означает, что у нас внутри пакета 5 конфет. Мы можем использовать while-let, чтобы доставать конфеты из пакета одну за другой:

while let Some(candies) = my_magical_candy_bag {
    if candies > 0 {
        println!("У нас осталось {} конфет. Давай съем одну!", candies);
        my_magical_candy_bag = Some(candies - 1);
    } else {
        my_magical_candy_bag = None;
    }
}

Мы обновляем количество конфет, оставшихся в пакете, каждый раз, когда съедаем одну. Когда пакет пуст, мы устанавливаем для него значение None, указывающее, что он пуст, и цикл while-let заканчивается.

Вот еще один пример. Предположим, у нас есть волшебная шкатулка, содержащая цифры от 1 до 5:

let mut magical_numbers_box = vec![1, 2, 3, 4, 5];

Мы можем использовать while-let, чтобы извлекать числа из массива одно за другим и выводить их в консоль:

while let Some(number) = magical_numbers_box.pop() {
    println!("Мы нашли число {} в волшебном ящике!", number);
}

Это приведет к печати:

Мы нашли число 5 в волшебном ящике!
Мы нашли число 4 в волшебном ящике!
Мы нашли число 3 в волшебном ящике!
Мы нашли число 2 в волшебном ящике!
Мы нашли число 1 в волшебном ящике!

Вот как while-let работает в Rust! Это помогает нам продолжать что-то делать со значениями внутри “пакета” или “коробки”, пока они не опустеют.

let-else

Представьте себе волшебную шкатулку, которая может содержать игрушку или быть пустой. Вы хотите открыть коробку и поиграть с игрушкой внутри, но если она пуста, вы хотите сделать что-то еще, например, купить новую игрушку.

Чтобы достичь этого, мы можем использовать ключевое слово let-else в Rust. Это позволяет нам увидеть, есть ли что-то внутри “коробки” (например, Option), и если да, то мы можем это использовать. Мы можем сделать что-то еще, если коробка пуста.

Вот простой пример. Предположим, у нас есть волшебная шкатулка с именем my_magical_box:

let my_magical_box = Some("игрушка");

Мы можем использовать let-else, чтобы проверить, есть ли внутри игрушка, и поиграть с ней. Если коробка пуста, мы можем купить новую игрушку:

let Some(toy) = my_magical_box else {
    println!("О нет! Коробка совершенно пуста. Давай купим новую игрушку!");
};
println!("Ура! Мы обнаружили {} в коробке! Давайте поиграем!", toy);

Мы посмотрим, есть ли там игрушка: “Ура! Мы обнаружили игрушку в коробке! Давайте поиграем!” Однако, если он пуст, мы увидим: “О нет! Коробка совершенно пуста. Давай купим новую игрушку!”.

Вот как работает let-else в Rust! Это позволяет нам определить, есть ли что-то внутри “коробки” или нет, а затем использовать это, если есть. Мы можем сделать что-то еще, если коробка пуста.

Наконец, мы погрузились в увлекательный мир возможностей сопоставления с образцами Rust, используя if-let, while-let и let-else. Теперь вы должны иметь четкое представление о том, как эти команды могут улучшить ваш опыт программирования на Rust, сделав ваш код более элегантным, читаемым и ремонтопригодным. Вы открыли для себя магию подбора шаблонов в Rust и сделали значительный шаг вперед в своем путешествии по Rust благодаря нашим веселым и увлекательным примерам.

Не забывайте продолжать практиковаться и применять эти концепции к реальным проблемам по мере того, как вы продолжаете исследовать Rust и узнавать о нем больше. Выразительность и безопасность Rust - вот что придает ему силу, и овладение этими инструментами подбора шаблонов поможет вам эффективно использовать эту силу. Так что дерзайте, и пусть магия Rust вдохновит вас на создание еще более потрясающего программного обеспечения!