rust - 如果通过谓词则返回值,否则默认

标签 rust option-type predicate

如果某个值未通过谓词,我该如何替换它?

举例说明:

assert_eq!((3-5).but_if(|v| v < 0).then(0), 0)

我以为 OptionResult 会允许这样做,但我找不到。

最佳答案

I thought there would be something on Option or Result

但这两种类型都没有出现在这里。两个数字相减会得到另一个数字。

看来您只需要一个传统的 if-else 语句:

fn main() {
    let a = 3 - 5;
    assert_eq!(if a < 0 { 0 } else { a }, 0);
}

由于您有两个可以比较的值,您可能还对 max 感兴趣:

use std::cmp::max;

fn main() {
    assert_eq!(max(0, 3 - 5), 0);
}

可以使您建议的语法有效,但我不确定它是否值得。未经进一步评论而提出...

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
        }
    }
}

关于rust - 如果通过谓词则返回值,否则默认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41384597/

相关文章:

rust - Rust 如何提供 move 语义?

rust - parking_lot 文档中显示 'allow raw (un)locking without a RAII guard object' 是什么意思?

swift - 检查 Swift 中的可选协议(protocol)方法会出现错误吗?

parameters - Prolog 将谓词统一为参数

java - 如何在运行时过滤 java 对象列表,其中我要过滤的变量事先未知?

c# - 如何使用谓词实现匹配算法?

rust - 如何编写一个具有返回引用的方法的特征并正确实现它?

vector - 一般如何将数据移出可索引集合?

ios - SpriteKit SKCameraNode - 在分配后展开可选值时为零

swift - 我可以使用 swift 使 self.entity 成为组件中某些功能的非可选吗?