是否有可以在 Rust 闭包中使用的内置“Or”函数?

Is there an inbuilt "Or" function which can be used in a Rust closure?

提问人:FreelanceConsultant 提问时间:9/3/2023 更新时间:9/3/2023 访问量:37

问:

我编写了以下 Rust 函数,其中包含一个闭包。

    fn has_a_none_element(&self) -> bool {

        let elements_is_none =
            self.elements.iter().flatten().map(Option::is_none);

        let optional_any_is_none =
            elements_is_none.reduce(
                |lhs, rhs| {
                    lhs || rhs
                }
            );

        match optional_any_is_none {
            
            None => false,
            Some(any_is_none) => any_is_none,
        }
    }

self.elements是类型,尽管这并不是特别重要。Vec<Vec<Option<f64>>>

重要的是闭合:

|lhs, rhs| {
    lhs || rhs
}

这是一个“或”函数。这是人们可能期望已经有一个内置函数可以用作闭包的一部分的东西。

这样的事情存在吗?

防锈 封盖

评论

1赞 interjay 9/3/2023
您可能正在寻找带闭包的 +,而不是 +。它还具有短路的优点。Iterator::anymapreduce
0赞 FreelanceConsultant 9/3/2023
@interjay 是的,这是一个更好的解决方案 - 请随时添加它作为答案

答:

2赞 kmdreko 9/3/2023 #1

直接对标题进行寻址,标准库中没有命名函数来表示运算符。其他运算符可以这样命名,但由于 logical-or 仅适用于自定义结构,因此这不是一回事。||And::andbool

不过,相邻的行为可以通过运算符获得(又称 BitOr 特征),并且除了短路之外,还具有与 s 相同的行为。使用它,我们可以得到这个:|||bool

use std::ops::BitOr;

let optional_any_is_none = elements_is_none.reduce(bool::bitor)

不过,为了解决最终目标,@interjay正确的是,你可以通过使用 .any() 来更好地表达你的整个函数:

fn has_a_none_element(&self) -> bool {
    self.elements.iter()
        .flatten()
        .any(Option::is_none)
}