条件判断表达式 if 与 if let

条件判断表达式在代码里特别常见, 给定一个条件, 如果它的值是 true, 就执行 if 表达式内部的代码块.

if condition1 {
  block1
} else if condition2 {
  block2
} else {
  block_n
}

跟 C/C++ 等语言不同之处在于, condition1 表达式返回值的类型必须是 bool, 这里不进行 隐式类型转换. 另外, 这里不需要用小括号把 condition1 包括起来, 这个省去小括号的写法在其它语言中也不多见.

int x = 42;
if (x) {
  do_some();
}

像上面的代码片段, 如果用 rust 重写的话, 必须要先把隐藏的条件补充完成:

let x = 42;
if x != 0 {
  do_some();
}

if let

用于简化 match 表达式, 在分支条件比较单一的时候, 使用 if let 表达式可读性更高.

if let pattern = expr {
  block1
} else {
  block2
}

它等同于以下的 match 表达式:

match expr {
  pattern => { block1 }
  _ => { block2 }
}

看一下示例:

#![allow(dead_code)]

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

fn main() {
    let a = Foo::Bar;
    // destructing enumeration
    if let Foo::Bar = a {
        println!("a is bar!");
    }
}

以上代码片段, 我们不需要给 Foo 实现 std::cmp::PartialEq 这个 trait, 就可以对它的值进行比较. 类似于以下实现:

#![allow(dead_code)]

#[derive(PartialEq)]
enum Foo {
    Bar,
    Baz,
    Qux(u32),
}

fn main() {
    let a = Foo::Bar;
    if a == Foo::Bar {
        println!("a is bar!");
    }
}

这里之所以可以用 == 是因为 Foo 实现了 PartialEq trait.