我对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)
但是如果我这样做,我总是必须打开param并value访问这些值。
我想过这样的事情来避免这种情况。但是这段代码不起作用:
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,如果这是你想要做的)。
如果您的函数正在处理多个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)
?运营商的更多信息