RUST 每日一省:if let & while let

        当我们在使用match时,一定要完整匹配,如果你只需要判断某个特定分支时,这时候match就显得比较冗冗余,而if let可以只匹配感兴趣的某个特定的分支, 这种情况下的写法比match简单点。

if let

        if let 的语法为 if let PATTERN=EXPRESSION{BODY}。 后面可以跟一个可选的else分支。

use std::collections::HashMap;
fn main() {
let mut map = HashMap::new();
map.insert("one", 1);
map.insert("two", 2);

let value = if let Some(v) = map.get("one") {
v + 1
} else {
0
};

println!("{}", value);
}


        if let块和while let块也会创建新的作用域, value是Option<String>类型, 所以在if let的赋值操作中会转移所有权,value将不再可用。如果value换做是Option<i32>就没有问题了,因为i32是复制语义,就是我们说的Copy,大家可以自行验证。

fn main(){
    let value = Some(String::from("hello world"));
    if let Some(v) = value{
        println!("{:?}",v);
    }
    //println!("{:?}",value);
}

如果不注释println!("{:?}",value);则会报错

         如果if let对应的模式没有匹配成功,那么else分支的代码就会得到执行。另外,我们同样可以混合使用if let、else if及else if let表达式来进行匹配。这种混合语法可以提供更多的灵活性,并且一系列if let、else if、else if let分支中的条件也不需要彼此相关。

fn main() {
let value1: Option<String> = None;
let value2 = false;
let value3: Result<i32> = Ok(20);

if let Some(value) = value1{
    println!("value1, {}", );
} else if value2 {
    println!("value2!");
} else if let Ok(value) = value3{
    if value> 30 {
        println!("value3 > 30");
    } else {
        println!("value3 < 30");
    }
} else {
        println!("end");
    }
}

while let

条件循环while let的构造与if let十分类似,但它会反复执行同一个模式匹配直到出现失败的情形。示例如下。

let a = Range(..);
while let Some(i) = a.next() {
// do something
}


 

猜你喜欢

转载自blog.csdn.net/xq723310/article/details/130261591
let
今日推荐