如何检查两个变量是否都是 Some?

Nel*_*Dav 7 rust

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

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

我知道match这样工作的模式:

match value {
    Some(val) => println!("{}", val),
    None => return false,
}
Run Code Online (Sandbox Code Playgroud)

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

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

            None => return false,
        }
    },

    None => return false,
}
Run Code Online (Sandbox Code Playgroud)

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

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

if param.is_some() && value.is_some() {
    //process
}
Run Code Online (Sandbox Code Playgroud)

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

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

if param == Some(par) && value == Some(val) {
    //process
}
Run Code Online (Sandbox Code Playgroud)

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

有没有办法做这样的事情?

Mat*_*ahl 11

如果我有多个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));
}         
Run Code Online (Sandbox Code Playgroud)

这允许我匹配有趣的组合,并丢弃其余的(或者返回 false,如果这是你想要做的)。


Opt*_*ach 8

如果您的函数正在处理多个Option值,并且想要丢弃它们(如果不是)Some,则您的函数可以返回Option自身:

fn foo(param: Option<usize>, value: Option<usize>) -> Option<usize> {
    let result = param? + value?;
    Some(result)
}
Run Code Online (Sandbox Code Playgroud)

如果或None中存储有值,这将使函数短路。paramvalue

请阅读本书以获取有关操作员的更多信息?

如果您的函数无法返回 an Option,您仍然可以使用if letor进行解构match

let x = if let (Some(p), Some(v)) = (param, value) {
    p + v
} else {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
let x = match (param, value) {
    (Some(p), Some(v)) => p + v,
    (Some(p), _) => p,
    (_, Some(v) => v,
    _ => return 0,
}
Run Code Online (Sandbox Code Playgroud)