如果某些条件对于 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 中进行此类转换的最惯用的方法是什么?
您正在寻找的是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)
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |