条件表达式中的if let
if let的模式匹配,是一种简化版的match匹配,示例代码如下:
fn main() {
let favorite_color: Option<&str> = None;
let is_tuesday = false;
let age: Result<u8, _> = "34".parse();
if let Some(color) = favorite_color {
println!("Using your favorite color, {}, as the background", color);
} else if is_tuesday {
println!("Tuesday is green day!");
} else if let Ok(age) = age {
if age > 30 {
println!("Using purple as the background color");
} else {
println!("Using orange as the background color");
}
} else {
println!("Using blue as the background color");
}
}
从示例代码中可以看出,其可以和else if 一起使用。
同时我们在使用if let的时候,会创建新的变量,这样会造成对外层作用域中变量的覆盖。比如,上述代码中的else if let Ok(age) = age就是产生了新的变量age,对条件语句的外层作用域中的变量进行了覆盖。
if let与match的区别就在于,if let不会穷举变量的所有可能的值,而match是必须要穷举模式的所有的值。
while let在条件循环语句中的使用
while let与if let很相似,示例代码如下:
fn main() {
let mut stack = Vec::new();
stack.push(1);
stack.push(2);
stack.push(3);
while let Some(top) = stack.pop() {
println!("{}", top);
}
}
当while let匹配的结果不是None时,while循环会一直执行下去,直到匹配的结果为None时。
for 循环中的模式匹配
模式匹配在for循环中主要用于对每次迭代产生的元组进行析构,分离出元组的变量。
示例代码如下:
fn main() {
let v = vec!['a', 'b', 'c'];
for (index, value) in v.iter().enumerate() {
println!("{} is at index {}", value, index);
}
}
enumerate方法会返回迭代器中的所有元素,每次迭代产生一个元组,元组的第一个元素是元素的索引,第二个元素是迭代容器中的数据。我们使用模式匹配来分离元组中的元素。
let语句进行变量绑定
示例代码如下:
// 单变量绑定
let x = 5;
// 对元组中的元素进行绑定
let (x, y, z) = (1, 2, 3);
当对元组中的元素进行模式绑定的时候,必须保证元组中的变量与元素的数量相同。
模式匹配在函数参数中的使用
我们可以在函数参数中使用元组来进行函数参数的模式绑定
示例代码如下:
fn print_coordinates(&(x, y): &(i32, i32)) {
println!("Current location: ({}, {})", x, y);
}
fn main() {
let point = (3, 5);
print_coordinates(&point);
}