fn main() { let x: i8 = 5; let y: Option = Some(5); //将 Option 中的 T 转换成 T let yy = y.expect("get Option fail"); let sum = x + yy; println!("{}", sum) }
match
允许一个值与一系列模式进行匹配,并执行匹配的模式对应的代码(示例)
enum Num { One, Two, Three, } fn value_in_cents(num: Num) -> u8 { // 依次匹配 match num { Num::One => { println!("match One"); 1 }, Num::Two => 2, Num::Three => 3, } } fn main() { let num = Num::One; println!("{}", value_in_cents(num)) }
绑定值的模式:匹配的分支可以绑定到被匹配对象的部份值,可以从 enum 变体中提取值
#[derive(Debug)] enum Name { Tim, Hope, } enum Num { One, Two, Three(Name), } fn value_in_cents(num: Num) -> u8 { // 依次匹配 match num { Num::One => { println!("match One"); 1 }, Num::Two => 2, Num::Three(name) => { println!("three name is: {:#?}", name);//three name is: Hope 3 }, } } fn main() { let num = Num::Three(Name::Hope); println!("{}", value_in_cents(num)) // 3 }
匹配 Option
fn main() { let five = Some(5); let six = plus_one(five); let none = plus_one(None); // println!("{}, {}", six, none); } fn plus_one(x: Option) -> Option { match x { None => None, Some(i) => Some(i+1), } }
match 匹配必须穷举所有的可能性(会在编译时检查),如果不需要处理,可以使用通配符“_”替代:
fn main() { let v = 0u8; match v { 1 => println!("one"), 2 => println!("two"), _ => (), } }
if let
处理只关注一种匹配,而忽略其他匹配的情况
更少的代码,更少的缩进,更少的模版代码
但是放弃了穷举的可能
fn main() { let v = 0u8; match v { 2 => println!("two"), _ => println!("other"), } // 等效于上面的逻辑 if let 2 = v { println!("two"); } else { println!("other"); } }