作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个函数 f
有签名
fn f(a: u8) -> Result<bool, SomeError> {}
现在我有一个 Vec<u8>
我想找出这个 Vec 中是否有任何元素的值是 f
是Ok(b)
, 在这种情况下,返回值 b
(并停止为 Vec 的其余部分计算 f
)。我希望有一个带有签名的函数
fn my_function(v: Vec<u8>) -> Option<bool> {}
这是我的第一个实现:
fn my_function(v: Vec<u8>) -> Option<bool> {
let found = v.par_iter().find_any(|a| f(a).is_ok());
match found {
Some(a) => Some(f(a).unwrap()),
None => None
}
}
但我在做一件没用的事f
计算在最后。我怎样才能重构代码来避免这个额外的 f
打电话?
人造丝 map
, filter
, reduce
不会起作用,因为它们会遍历整个 Vec,我想避免这种情况。
最佳答案
Rayon's .flat_map(…)
method将 f
应用于每个元素,将每个返回值视为一个迭代器,并将所有这些结果展平为一个新的迭代器。 Result
s can be used as iterables of one (if Ok
) or zero (if Err
) elements ,因此这具有展开 Ok
结果并丢弃 Err
的效果。然后,您可以应用 .find_any(|_| true)
来获取第一个可用的结果值,而无需再次调用 f(…)
。
use rayon::prelude::*;
fn my_function(v: Vec<u8>) -> Option<bool> {
v.par_iter().flat_map(|x| f(*x)).find_any(|_| true)
}
fn f(a: u8) -> Result<bool, SomeError> {
if a == 42 {
Ok(true)
} else {
Err(SomeError {})
}
}
fn main() {
println!("{:?}", my_function(vec![0, 1, 2, 42, 3, 42, 0]));
}
#[derive(Debug)]
struct SomeError {}
impl std::error::Error for SomeError {}
impl std::fmt::Display for SomeError {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
Some(true)
关于rust - Rayon find_any,返回找到的项的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55959715/
假设我有一个函数 f有签名 fn f(a: u8) -> Result {} 现在我有一个 Vec我想找出这个 Vec 中是否有任何元素的值是 f是Ok(b) , 在这种情况下,返回值 b (并停止为
我是一名优秀的程序员,十分优秀!