Rust代码优化之 巧用 if let

54 阅读1分钟

最近在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
}