首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果通过谓词,则返回值,否则为默认值

如果通过谓词,则返回值,否则为默认值
EN

Stack Overflow用户
提问于 2016-12-29 17:36:41
回答 2查看 298关注 0票数 1

如果一个值失败了谓词,我如何替换它?

为了说明:

代码语言:javascript
复制
assert_eq!((3-5).but_if(|v| v < 0).then(0), 0)

我以为OptionResult上会有允许这样做的东西,但我找不到。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-29 17:39:58

我以为OptionResult上会有什么东西

但这两种类型都没有出现在这里。减去两个数字会产生另一个数字。

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

代码语言:javascript
复制
fn main() {
    let a = 3 - 5;
    assert_eq!(if a < 0 { 0 } else { a }, 0);
}

因为有两个可以比较的值,所以您也可能对max感兴趣。

代码语言:javascript
复制
use std::cmp::max;

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

您可以使用您建议的语法,但我不确定它是否值得。不作进一步评论..。

代码语言:javascript
复制
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
        }
    }
}
票数 5
EN

Stack Overflow用户

发布于 2016-12-29 19:35:20

更新:自从锈1.27添加Option::filter以来,的效果更好一些:

代码语言:javascript
复制
assert_eq!(Some(3 - 5).filter(|&v| v >= 0).unwrap_or(0), 0);

在Rust 1.27之前,您可能需要一个迭代器才能编写一个单一的链式表达式,而不需要大量额外的自定义机器:

代码语言:javascript
复制
assert_eq!(Some(3 - 5).into_iter().filter(|&v| v >= 0).next().unwrap_or(0), 0);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41384597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档