在 Rust 中给定谓词,将 Some 转换为 None 的惯用方法是什么?

dad*_*ade 1 rust

如果某些条件对于 Some 中的值成立,我希望能够将 a 转换Some为 a 。None

例如,如果我有Some(false)它应该变成 a 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)"
Run Code Online (Sandbox Code Playgroud)

甚至这个

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)"
Run Code Online (Sandbox Code Playgroud)

环顾文档,我找不到以更简洁的方式执行此操作的方法。

就像是

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

Run Code Online (Sandbox Code Playgroud)

Rust 中进行此类转换的最惯用的方法是什么?

Cha*_*man 5

您正在寻找的是filter(),尽管它的作用与您所要求的相反:它会转换为Noneif 谓词返回false。所以你需要否定表达式:

let v = option.filter(|&v| !(v == false));
Run Code Online (Sandbox Code Playgroud)

要不就:

let v = option.filter(|&v| v);
Run Code Online (Sandbox Code Playgroud)