Rust中的if let选项和比较条件

5

我有很多这样的代码,并且想要用"if let"绑定来替换,以增加我的代码可读性。

// contrived
fn maybe() -> Option<i32> { Some(1)}
let maybe_num_A = maybe();
let maybe_num_B = maybe();
...
match (maybe_num_A, maybe_num_B) {
  (Some(a) , Some(b)) if a > b => {
      .... 
  }
  _ => {} // don't care many times about the other matches that doesn't hold. how to get rid of this?
}

不确定如何使用语法将 let 与比较绑定:
if let (Some(a),Some(b) = (maybe_num_A, maybe_num_B) ???&&??? a > b {
   ... 
}
2个回答

4

如果您只是比较AB,并且不一定需要将它们绑定在一起,您可以使用.zip方法(在Rust 1.46中),并在其上应用map_or,例如:

let a: Option<i32> = Some(42);
let b: Option<i32> = Some(-42);

if a.zip(b).map_or(false, |(a, b)| a > b) {
   // 42 is greater than -42
}

如果两个值中的任意一个是None,则会默认为false

3

不确定如何将let与比较绑定的语法:

很遗憾,这是不可能的。如果您需要从模式中访问绑定变量,您必须采用传统的方式:

if let (Some(a), Some(b)) = (maybe_num_A, maybe_num_B) {
    if a > b {
         ...
    }
}

如果您不需要从模式中获取绑定,那么Jason的回答就可以胜任,并且可能会更加简洁,只要实际模式相对简单即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接