if let语法使您可以将if和let组合成一种不太冗长的方式来处理与一种模式匹配的值,而忽略其余模式。 例如:该程序与Option <u8>值匹配,但仅想在值为3时执行代码:

fn main() {
    let some_u8_value = Some(0u8);
    match some_u8_value {
        Some(3) => println!("three"),
        _ => (println!("啥也不是")),
    }
}

我们想对Some(3)匹配做点什么,但对其他Some <u8>值或None值什么都不做。 为了满足match表达式,我们只需要处理一个变体就添加_ =>(),但是需要添加的许多样板代码。
相反,我们可以使用if let以更短的方式编写此代码并实现完全一致的匹配效果:

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

    if let Some(8) = some_u8_value {
        println!("匹配到了");
    }
}

D:\learn\cargo_learn>cargo run
   Compiling cargo_learn v0.1.0 (D:\learn\cargo_learn)
    Finished dev [unoptimized + debuginfo] target(s) in 0.27s
     Running `target\debug\cargo_learn.exe`
匹配到了

相应的如果我们想要得到一个确切的结果,比如如果没有匹配到我们需要的那个我们希望有返回结果,那么此时可以使用else:

#[derive(Debug)]
enum UsState {
    Alabama,
    Alaska,
}

enum Coin {
    Penny,
    Quarter(UsState),
}

fn main() {
    let coin = Coin::Penny;
    let mut count = 0;
    if let Coin::Quarter(state) = coin {
        println!("State quarter from {:?}!", state);
    } else {
        count += 1;
        println!("没有匹配到任何结果, count将自动+1 !!!")
    }
}


D:\learn\cargo_learn>cargo run
   Compiling cargo_learn v0.1.0 (D:\learn\cargo_learn)
warning: variable `count` is assigned to, but never used
  --> src\main.rs:14:9
   |
14 |     let mut count = 0;
   |         ^^^^^^^^^
   |
   = note: `#[warn(unused_variables)]` on by default
   = note: consider using `_count` instead

warning: value assigned to `count` is never read
  --> src\main.rs:18:9
   |
18 |         count += 1;
   |         ^^^^^
   |
   = note: `#[warn(unused_assignments)]` on by default
   = help: maybe it is overwritten before being read?

warning: variant is never constructed: `Alabama`
 --> src\main.rs:3:5
  |
3 |     Alabama,
  |     ^^^^^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: variant is never constructed: `Alaska`
 --> src\main.rs:4:5
  |
4 |     Alaska,
  |     ^^^^^^

warning: variant is never constructed: `Quarter`
 --> src\main.rs:9:5
  |
9 |     Quarter(UsState),
  |     ^^^^^^^^^^^^^^^^

warning: 5 warnings emitted

    Finished dev [unoptimized + debuginfo] target(s) in 0.51s
     Running `target\debug\cargo_learn.exe`
没有匹配到任何结果, count将自动+1 !!!

子康
10 声望0 粉丝