Основная разница между if и if-let в Rust - PullRequest
0 голосов
/ 11 января 2020

Я не вижу причины, по которой мы используем if let и просто обычно if. В книге Rust, глава 6.3, пример кода приведен ниже:

let some_u8_value = Some(0u8);
if let Some(3) = some_u8_value {
    println!("three");
}

Код выше такой же:

let some_u8_value = Some(0u8);
if Some(3) == some_u8_value {
    println!("three");
}

Любая другая причина, по которой мы будем использовать if let или для чего конкретно?

Ответы [ 2 ]

6 голосов
/ 11 января 2020

Другая причина в том, что если вы sh до используете привязки к шаблону. Например, рассмотрим перечисление:

enum Choices {
  A,
  B,
  C(i32),
}

Если вы хотите sh реализовать спецификацию c logi c для C варианта Choices, вы можете использовать выражение if-let :

let choices: Choices = ...;

if let Choices::C(value) = choices {
    println!("{}", value * 2);
}
2 голосов
/ 11 января 2020

Выражение if let семантически похоже на выражение if, но вместо выражения условия ожидает ключевое слово let, за которым следует шаблон, выражение = и выражение проверки. Если значение проверяющего соответствует шаблону, будет выполнен соответствующий блок. В противном случае поток переходит к следующему блоку else, если он существует. Подобно выражениям if, если выражения let имеют значение, определяемое оцениваемым блоком.

Source

if let может использоваться для сопоставления любому перечислению значение:

enum Foo {
    Bar,
    Baz,
    Qux(u32)
}

fn main() {
    // Create example variables
    let a = Foo::Bar;
    let b = Foo::Baz;
    let c = Foo::Qux(100);

    // Variable a matches Foo::Bar
    if let Foo::Bar = a {
        println!("a is foobar");
    }

    // Variable b does not match Foo::Bar
    // So this will print nothing
    if let Foo::Bar = b {
        println!("b is foobar");
    }

    // Variable c matches Foo::Qux which has a value
    // Similar to Some() in the previous example
    if let Foo::Qux(value) = c {
        println!("c is {}", value);
    }

    // Binding also works with `if let`
    if let Foo::Qux(value @ 100) = c {
        println!("c is one hundred");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...