gpt4 book ai didi

rust - 为什么 filter() 对并行迭代器有不同的类型要求?

转载 作者:行者123 更新时间:2023-12-04 01:05:24 27 4
gpt4 key购买 nike

我试图理解为什么 Rayon 的 filter() 函数在不需要指定正确类型的情况下无法工作,而如果我'我没有使用并行迭代器。这是我的代码:

use rayon::prelude::*;

fn is_even(n: i64) -> bool {
n % 2 == 0
}

fn main() {
let v: Vec<_> = (1..300_000_000)
.into_par_iter() // works correctly without this line, but not parallel
.filter(|&x| is_even(x))
.collect();
}

错误信息如下:

error[E0271]: type mismatch resolving `<rayon::range::Iter<i32> as rayon::iter::ParallelIterator>::Item == i64`
--> src/main.rs:11:10
|
11 | .filter(|&x| is_even(x))
| ^^^^^^ expected `i32`, found `i64`

error[E0271]: type mismatch resolving `<rayon::range::Iter<i32> as rayon::iter::ParallelIterator>::Item == i64`
--> src/main.rs:12:10
|
12 | .collect();
| ^^^^^^^ expected `i32`, found `i64`
|
= note: required because of the requirements on the impl of `rayon::iter::ParallelIterator` for `rayon::iter::Filter<rayon::range::Iter<i32>, [closure@src/main.rs:11:17: 11:32]>`

如果我不使用 into_par_iter(),为什么 filter() 只在没有指定整数种类的情况下工作? (我知道我可以通过将范围标记为 i64 来修复它,但不知道为什么有必要这样做)

最佳答案

更新: 此类型推断问题已 fixed在人造丝 1.5.1 中


为什么确实...深入研究,这是由于人造丝确定 Range 是否存在的方式所致。工具 IntoParallelIterator .

impl<T> IntoParallelIterator for Range<T> where Iter<T>: ParallelIterator { ... }

struct Iter<T> {
range: Range<T>,
}

impl ParallelIterator for Iter<u8> { type Item = u8; }
impl ParallelIterator for Iter<u16> { type Item = u16; }
impl ParallelIterator for Iter<u32> { type Item = u32; }
impl ParallelIterator for Iter<u64> { type Item = u64; }
impl ParallelIterator for Iter<i8> { type Item = i8; }
impl ParallelIterator for Iter<i16> { type Item = i16; }
impl ParallelIterator for Iter<i32> { type Item = i32; }
impl ParallelIterator for Iter<i64> { type Item = i64; }
// etc

编译器正在尝试查看是否 (1..300_000_000).into_par_iter()甚至是合法的,因为 ParallelIteratorIter<T> 实现单独输入,它被迫现在推断出什么T在它继续之前。

请参阅 playground 上的非工作重建.

如果相反,他们做了类似的事情:

impl<T> ParallelIterator for Iter<T> where T: SomeIntegerType + Send {
type Item = T;
}

trait SomeIntegerType {}
impl SomeIntegerType for u8 {}
impl SomeIntegerType for u16 {}
impl SomeIntegerType for u32 {}
impl SomeIntegerType for u64 {}
impl SomeIntegerType for i8 {}
impl SomeIntegerType for i16 {}
impl SomeIntegerType for i32 {}
impl SomeIntegerType for i64 {}
// etc

编译器可以看到Iter 是否实现ParallelIterator只要T工具 SomeIntegerType ,但它不必现在推导类型,它可以等到以后。

查看我在 playground 上的重建工作.

关于rust - 为什么 filter() 对并行迭代器有不同的类型要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66666909/

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