Mat*_*iak 1 predicate optional rust
如果谓词失败,如何替换值?
为了显示:
assert_eq!((3-5).but_if(|v| v < 0).then(0), 0)
Run Code Online (Sandbox Code Playgroud)
我以为会有一些东西Option或Result允许这个,但我找不到它.
我以为会有什么东西
Option或者Result
但这些类型都不会出现在这里.减去两个数字会产生另一个数字.
看起来你只想要一个传统的if-else语句:
fn main() {
let a = 3 - 5;
assert_eq!(if a < 0 { 0 } else { a }, 0);
}
Run Code Online (Sandbox Code Playgroud)
由于您有两个可以比较的值,您可能还对以下内容感兴趣max:
use std::cmp::max;
fn main() {
assert_eq!(max(0, 3 - 5), 0);
}
Run Code Online (Sandbox Code Playgroud)
您可以使您的建议语法有效,但我不确定它是否值得.提交时没有进一步评论......
fn main() {
assert_eq!((3 - 5).but_if(|&v| v < 0).then(0), 0)
}
trait ButIf: Sized {
fn but_if<F>(self, f: F) -> ButIfTail<Self>
where F: FnOnce(&Self) -> bool;
}
// or `impl<T> ButIf for T {` for maximum flexibility
impl ButIf for i32 {
fn but_if<F>(self, f: F) -> ButIfTail<Self>
where F: FnOnce(&Self) -> bool,
{
ButIfTail(f(&self), self)
}
}
struct ButIfTail<T>(bool, T);
impl<T> ButIfTail<T> {
fn then(self, alt: T) -> T {
if self.0 {
alt
} else {
self.1
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |