首页 > 解决方案 > 如何检查两个变量是否都是 Some?

问题描述

我对Some(T)关键字感到困惑。

None如果值已定义(不是),我想检查两个变量。如果是这种情况,则处理此变量的值。

我知道这样的match模式:

match value {
    Some(val) => println!("{}", val),
    None => return false,
}

如果我使用这种模式,它会变得非常混乱:

match param {
    Some(par) => {
        match value {
            Some(val) => {
                //process
            },

            None => return false,
        }
    },

    None => return false,
}

这不可能是正确的解决方案。

有可能询问参数和值is_some()是否会影响这样的代码:

if param.is_some() && value.is_some() {
    //process
}

但如果我这样做,我总是必须打开包装paramvalue访问这些值。

我想过这样的事情来避免这种情况。但是这段代码不起作用:

if param == Some(par) && value == Some(val) {
    //process
}

这个想法是这些值可以被版本访问par并且val就像它们在match版本中一样。

有什么解决方案可以做这样的事情吗?

标签: rust

解决方案


如果我有多个Option要匹配的值,我会匹配一组值:

enum Color {
    Red,
    Blue,
    Green,
}

fn foo(a: Option<Color>, b: Option<i32>) {
    match (a, b) {
        (Some(Color::Blue), Some(n)) if n > 10 => println!("Blue large number"),
        (Some(Color::Red), _) => println!("Red number"),
        _ => (),
    }
}

fn main() {
    foo(Some(Color::Blue), None);
    foo(Some(Color::Blue), Some(20));
}         

这使我可以匹配有趣的组合,并丢弃其余的组合(或返回 false,如果这是您想要做的)。


推荐阅读