我希望能够将Some转换为None,如果某些特定条件对某些值成立的话.

例如,如果我有Some(false),它应该变成None,而Some(true)应该保持为Some(true)

我找到了一些方法来做到这一点.

let value1: Option<bool> = Some(false);
let value2: Option<bool> = Some(true);

let result1 = value1.and_then(|inner| if inner == false { None } else { Some(inner) });
let result2 = value2.and_then(|inner| if inner == false { None } else { Some(inner) });

println!("{:?}", result1); // Prints "None"
println!("{:?}", result2); // Prints "Some(true)"

或者甚至是这个

let value1: Option<bool> = Some(false);
let value2: Option<bool> = Some(true);

let result1 = if let Some(false) = value1 { None } else { value1 };
let result2 = if let Some(false) = value2 { None } else { value2 };

println!("{:?}", result1); // Prints "None"
println!("{:?}", result2); // Prints "Some(true)"

环顾了一下文档,我找不到一种更简洁的方法来做到这一点.

像这样的东西

let value = Some(v).to_none_if(predicate)

where value will be None, if predicate is true
or value will remain Some(v) if predicate is false

在Rust中,进行这种类型的转换最惯用的方式是什么?

推荐答案

您正在寻找的是filter(),尽管它做的与您所要求的相反:如果谓词返回102,则它将转换为None.因此,您需要否定以下表达式:

let v = option.filter(|&v| !(v == false));

或者只是:

let v = option.filter(|&v| v);

Rust相关问答推荐

为什么是!为Rust中的RwLockReadGuard和RwLockWriteGuard实现的发送特征?

如何go 除铁 rust 中路径组件的第一项和最后一项?

如何格式化传入Rust中mysql crate的Pool::new的字符串

如何正确重新排列代码以绕过铁 rust 借入判断器?

是否可以在不切换到下一个位置的情况下获得迭代器值:

定义只有一些字段可以缺省的 struct

用于判断整数块是否连续的SIMD算法.

`actix-web` 使用提供的 `tokio` 运行时有何用途?

如何将带有嵌套borrow /NLL 的 Rust 代码提取到函数中

RUST 中的读写器锁定模式

为什么需要静态生命周期以及在处理 Rust 迭代器时如何缩小它?

sha256 摘要仅适用于 &*

如何将这些测试放在一个单独的文件中?

为什么基于 clap::Parser 读取的大量数字进行计算比硬编码该数字时慢?

如何在 nom 中构建负前瞻解析器?

TcpStream::connect - 匹配武器具有不兼容的类型

为什么我可以在没有生命周期问题的情况下内联调用 iter 和 collect?

如何用另一个变量向量置换 rust simd 向量?

相互调用的递归异步函数:检测到循环

这个 match 语句的默认值应该是什么,还有一种方法可以解开 Some case (chess in rust)