Option 枚举

Option 枚举值特殊语法
let Some(num) = value
if或者while条件语句中,只要当前的条件是 Some,那么判断为 true。

if let 语法 中使用

if let 语法可以认为是只区分两种情况的 match 语句的"语法糖",可以在之后添加一个 else 块来处理例外情况。

if let 匹配值 = 源变量 {
    语句块
}
// 示例
let i = 0;
if let 0 = i {
    println!("zero");
}
// 对枚举依然适用
fn main() {
    enum Book {
        Papery(u32),
        Electronic(String)
    }
    let book = Book::Electronic(String::from("url"));
    if let Book::Papery(index) = book {
        println!("Papery {}", index);
    } else {
        println!("Not papery book");
    }
}
let value: Option<i32> = Some(12);
if let Some(num) = value {
    println!("有效值:{}", num)
} else {
    println!("无效值:None")
}
// 输出:有效值:12

解释:首先声明了一个 value 变量,同时分配了一个枚举值Some(12),接下来在 if 语句中使用let Some(num) = value,如果 value 是一个 Some 枚举值就会把该枚举值包裹的数据取出来赋值给变量num进去第一个分支语句块中,如果 value 是一个 None 类型枚举值,就会进入 else 分支语句块中。

// ------- 示例 1 -------
let value: Option<i32> = None;
if let None = value {
    println!("is None")
} else {
    println!("not None")
}
// 输出:is None

// ------- 示例 2 -------
enum Day {
    firtst,
    second,
}
let c = Day::firtst;
if let Day::firtst = c {
    println!("枚举值相等")
}
// 输出:枚举值相等

// ------- 示例 3 -------
let d = 12;
let txt = if let 12 = d {
    "等于12"
} else {
    "不等于12"
};
println!("txt: {}", txt);
// 输出:txt: 等于12

if let语句的表达式部分在等号两端数据类型要一致,比如都是 Optional 或者 Result 的类型,或者都是枚举、i32 等类型。但是对于非枚举值使用 if let 显得不合适。

while 中使用

fn main() {
   let mut iter = (1..5).into_iter();
   // 这里 next() 方法返回 Option 枚举类型的值
   while let Some(val) = iter.next() {
      println!("val: {}", val);
   }
}

match 中使用

fn main() {
   let v = Some(3);
   match v {
      Some(a) => println!("value: {}", a),
      // match 分支中最后一条使用 _ 表示除了上面的可能性外都进入该分支
      // 类似于 if/else 中的 else 语句
      _=>(),
   }
}

在 match 分支中匹配确定的值

fn main() {
    let v = Some(3);
    let c= match v {
        // Some(a) => a,
        Some(2) => 12,
        Some(3) => 13,
        _ => 0
    };
    println!("c = {}", c);
    // 输出:13
}

if let& match 支持同时匹配多个条件,使用 | 分割

// match 语句
fn main() {
    let v = Some(2);
    let c= match v {
        Some(2) | Some(3) => 18,
        _ => 0
    };
    println!("c = {}", c);
    // 输出:c = 18
}

// if let 语句
fn main() {
    let v = Some(2);
    let c = if let Some(2) | Some(3) = v {
        18
    } else {
        0
    };
    println!("c = {}", c);
    // 输出:c = 18
}
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值