Rust 中 if 和 if-let 的主要区别

Yos*_*aya 12 rust

我不明白我们使用的原因if let,只是通常的if. 在 Rust 书的第 6.3 章中,示例代码如下:

let some_u8_value = Some(0u8);
if let Some(3) = some_u8_value {
    println!("three");
}
Run Code Online (Sandbox Code Playgroud)

上面的代码与:

let some_u8_value = Some(0u8);
if Some(3) == some_u8_value {
    println!("three");
}
Run Code Online (Sandbox Code Playgroud)

关于我们为什么要使用if let它或它专门用于什么的任何其他原因?

ssh*_*124 9

另一个原因是您是否希望使用模式绑定。例如考虑一个枚举:

enum Choices {
  A,
  B,
  C(i32),
}
Run Code Online (Sandbox Code Playgroud)

如果您希望为 的C变体实现特定逻辑Choices,您可以使用 if-let 表达式:

let choices: Choices = ...;

if let Choices::C(value) = choices {
    println!("{}", value * 2);
}
Run Code Online (Sandbox Code Playgroud)


koo*_*oos 4

if let 表达式在语义上与 if 表达式类似,但它需要关键字 let 后跟一个模式、一个 = 和一个 scrutinee 表达式来代替条件表达式。如果检查者的值与模式匹配,则相应的块将被执行。否则,流程将继续执行以下 else 块(如果存在)。与 if 表达式一样,if let 表达式的值由计算的块确定。

来源

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");
    }
}
Run Code Online (Sandbox Code Playgroud)