if let
表达式if let Ok(age) = age
这条语句引入了新的变量age
来存储Ok
变体中的值,而它覆盖了右侧的同名变量。
fn main() {
let color: Option<&str> = None;
let is_tuesday = false;
let age: Result<u8, _> = "33".parse();
if let Some(c) = color {
println!("background clolr:{}", c);
} else if let Ok(age) = age {
if age > 30 {
println!("age > 30")
} else {
println!("age <= 30");
}
} else if is_tuesday {
println!("tuesday");
} else {
println!("default color")
}
}
while let
循环while let
会反复执行同一个模式匹配直到出现失败的情况。如果动态数组为空,则pop
返回None
。while
循环会在pop
返回Some
时迭代执行循环体中的代码,并在pop
返回None
时结束循环。
fn main() {
let mut stack = Vec::new();
stack.push(1);
stack.push(2);
stack.push(3);
while let Some(top) = stack.pop() {
println!("{}", top);
}
}
for
enumerate
作为迭代器的适配器,它会在每次迭代过程中生成一个包含值本身及值索引的元组。
fn main() {
let mut stack = Vec::new();
stack.push(1);
stack.push(2);
stack.push(3);
for (index, value) in stack.iter().enumerate() {
println!("{} is at index {}", value, index)
}
}
模式可以被分为不可失败(irrefutable
)和可失败(refutable
)两种类型。不可失败模式能够匹配任何传入的值。例如,语句let x = 5;
。
可失败模式可能因为某些特定的值而匹配失败。例如,表达式if let Some(x) = value
中的Some(x)
便是可失败模式。如果value
的值是None
而不是Some
,那么表达式左侧的Some(x)
模式就会发生不匹配的情况。
尝试使用let
来处理可失败的模式、或者使用if let
来处理不可失败的模式都会导致编译报错。match
表达式的匹配分支中,除了最后一个,其他必须全部使用可失败模式,而最后的分支应该使用不可失败模式,因为它需要匹配值的所有剩余情形。
match
第二个匹配分支引入了新的变量y
,它会匹配Some
变体中携带的任意值。因为我们处在match
表达式创建的作用域中,所以这里的y
是一个新的变量,而不是我们在程序起始处声明的那个变量y
。
fn main() {
let x = Some(5);
let y = 10;
match x {
Some(50) => println!("Got 50"),
Some(y) => println!("Matched, y={:?}", y),
_ => println!("Default case, x={:?}", x),
}
}
你可以在match
表达式的分支匹配中使用|
来标识or
的意思,它可以被用来一次性地匹配多个模式。
fn main() {
let x = 10;
match x {
10 | 12 => println!("hit"),
_ => println!("something else"),
}
}
@运算符允许我们在测试一个值是否匹配模式的同时创建存储该值的变量,判断Message::Hello
的id
字段是否在区间3..7
中,使用的语法是3..=7
。
enum Message {
Hello { id: i32 },
}
fn main() {
let msg = Message::Hello { id: 5 };
match msg {
Message::Hello {
id: id_variable @ 3..=7,
} => {
println!("Found id in range:{}", id_variable)
}
Message::Hello { id: 10..=12 } => {
println!("Found id in another range")
}
Message::Hello { id } => {
println!("Found some other:{}", id)
}
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容