最近在review团队同学代码时,发现有一个现象。 关于多个条件判断时,代码层级非常深,显得非常臃肿,具体例子大致如下:
#[derive(Debug)]
struct Info {
name: Option<String>,
addr: Option<String>,
phone: Option<usize>,
}
fn main() {
let info = Info {
name: Some("info_name".to_string()),
addr: Some("info_addr".to_string()),
phone: Some(19912345678),
};
println!("info:{:?}", check_info(info))
}
fn check_info(info: Info) -> bool {
if let Some(name) = info.name {
if let Some(addr) = info.addr {
if let Some(phone) = info.phone {
println!("name{:?},addr:{:?},phone:{:?}", name, addr, phone);
return true;
}
}
}
false
}
我们看下check_info
的函数,这个函数是判断当前info
的信息Option
是否有值。
使用了if let Some(xxx) = yyy
这种语法来判断,用了多个条件逐级判断。
但这种写法看起来非常恶心。可以采用pattern方式解决这种层级深的问题,我们看关键代码:
if let Some(name) = info.name {
if let Some(addr) = info.addr {
if let Some(phone) = info.phone {
println!("name{:?},addr:{:?},phone:{:?}", name, addr, phone);
return true;
}
}
false
}