当我们在使用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 = None;
let value2 = false;
let value3: Result = 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
while let
条件循环while let的构造与if let十分类似,但它会反复执行同一个模式匹配直到出现失败的情形。示例如下。
let a = Range(..);
while let Some(i) = a.next() {
// do something
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net