条件判断表达式 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.