gpt4 book ai didi

rust - Rayon find_any,返回找到的项的值

转载 作者:行者123 更新时间:2023-11-29 08:17:56 24 4
gpt4 key购买 nike

假设我有一个函数 f有签名

fn f(a: u8) -> Result<bool, SomeError> {}

现在我有一个 Vec<u8>我想找出这个 Vec 中是否有任何元素的值是 fOk(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(…) methodf 应用于每个元素,将每个返回值视为一个迭代器,并将所有这些结果展平为一个新的迭代器。 Results 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)
}
}

Playground Output

Some(true)

关于rust - Rayon find_any,返回找到的项的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55959715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com