假设我们有一个闭包,它返回一个像这样的元组:

let closure_process = || -> (bool, Option<usize>) {
  ...
};

当该对的第一个元素为真时,第二个元素可能具有一定的价值. 当该对的第一个元素为假时,第二个元素始终为NONE.

我们可以这样调用闭包:

let pair = closure_process();
if pair.0 {
  match pair.1 {
    Some(i) => ...
    None => ...
  }
}

有没有一种更好的方式来做到这一点呢?

推荐答案

您可以匹配整个元组:

let pair = closure_process();
match pair {
    (true, Some(i)) => ...,
    (true, None) => ...,
    (false, None) => ...,
    _ => unreachable!(),
}

如果你决定这个闭包返回什么,你可以使用Option<Option<usize>>,这样你就可以省略unreachable!()分支.

let pair = closure_process();
match pair {
    Some(Some(i)) => ...,
    Some(None) => ...,
    None => ...,
}

Rust相关问答推荐

什么是谓词的简短和简洁类型

为什么拥有的trait对象的相等运算符移动了正确的操作数?

如何访问Rust存储值的内存地址

关于如何初始化弱 struct 字段的语法问题

如何编写一个以一个闭包为参数的函数,该函数以另一个闭包为参数?

在Rust中是否可以使用Rc自动化约束传播

如何在递归数据 struct 中移动所有权时变异引用?

如何在不调用Collect()的情况下为新型vec实现IntoIterator?

为什么不';t(&;mut-iter).take(n)取得iter的所有权?

我可以解构self 参数吗?

UnsafeCell:它如何通知 rustc Select 退出基于别名的优化?

Boxing 如何将数据从堆栈移动到堆?

`tokio::pin` 如何改变变量的类型?

Rust Redis 中的 HSET 命令问题

仅当函数写为闭包时才会出现生命周期错误

打印 `format_args!` 时borrow 时临时值丢失

无法理解 Rust 对临时值的不可变和可变引用是如何被删除的

判断 is_ok 后重用结果

Rust HRTB 是相同的,但编译器说一种类型比另一种更通用

传递 Option<&mut T> 时何时需要 mut