提问人:FreelanceConsultant 提问时间:9/3/2023 更新时间:9/3/2023 访问量:37
是否有可以在 Rust 闭包中使用的内置“Or”函数?
Is there an inbuilt "Or" function which can be used in a Rust closure?
问:
我编写了以下 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
}
这是一个“或”函数。这是人们可能期望已经有一个内置函数可以用作闭包的一部分的东西。
这样的事情存在吗?
答:
2赞
kmdreko
9/3/2023
#1
直接对标题进行寻址,标准库中没有命名函数来表示运算符。其他运算符可以这样命名,但由于 logical-or 仅适用于自定义结构,因此这不是一回事。||
And::and
bool
不过,相邻的行为可以通过运算符获得(又称 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)
}
评论
Iterator::any
map
reduce