Rust 如何迭代和过滤数组?

Rust 如何迭代和过滤数组?,rust,Rust,我试图写一个程序,包括过滤和折叠数组。我一直在使用它作为参考,但我不明白在数组上形成迭代器时会发生什么。以下是一个例子: fn compiles() { let range = (1..6); let range_iter = range.into_iter(); range_iter.filter(|&x| x == 2); } fn does_not_compile() { let array = [1, 4, 3, 2, 2]; let a

我试图写一个程序,包括过滤和折叠数组。我一直在使用它作为参考,但我不明白在数组上形成迭代器时会发生什么。以下是一个例子:

fn compiles() {
    let range = (1..6);
    let range_iter = range.into_iter();
    range_iter.filter(|&x| x == 2);
}

fn does_not_compile() {
    let array = [1, 4, 3, 2, 2];
    let array_iter = array.into_iter();
    //13:34 error: the trait `core::cmp::PartialEq<_>` is not implemented for the type `&_` [E0277]
    array_iter.filter(|&x| x == 2);
}

fn janky_workaround() {
    let array = [1, 4, 3, 2, 2];
    let array_iter = array.into_iter();
    // Note the dereference in the lambda body
    array_iter.filter(|&x| *x == 2);
}
fn编译(){
设范围=(1..6);
让range_iter=range.into_iter();
范围滤波器(|&x | x==2);
}
fn不编译(){
设数组=[1,4,3,2,2];
让array_iter=array.into_iter();
//13:34错误:未为类型“&”[E0277]实现特性“core::cmp::PartialEq”
阵列滤波器(|&x | x==2);
}
fn janky_变通方法(){
设数组=[1,4,3,2,2];
让array_iter=array.into_iter();
//注意lambda主体中的解引用
阵列滤波器(|&x |*x==2);
}
()


在第一个函数中,我认为范围内的迭代器不具有所有权,因此我必须在
过滤器
的lambda中使用
&x
,但我不理解为什么第二个示例与数组的行为不同。

在这种情况下,强制编译器告诉您变量的类型非常有用。让我们通过将闭包参数指定给不兼容的类型来触发类型错误:

array|iter.filter(|x |{let:()=x;x==2});
这在以下情况下失败:

错误[E0308]:类型不匹配
-->src/lib.rs:4:41
|
4 |阵列滤波器(|x |{let:()=x;x==2});
|-->应为“()”,找到“&&{integer}`
|                                    |
|因此,预计
现在我们知道,
x
的类型是一个
&&&{integer}
-对某种整数的引用。然后我们可以与之匹配:

fn万岁(){
设数组=[1,4,3,2,2];
让array_iter=array.into_iter();
阵列滤波器(|&x | x==2);
}
现在的问题变成了“为什么它是一个对一个引用的引用”?简短的版本是(参见
type Item=&'a T
部分)。此外,为了防止移动和随后丢失非
复制
类型,请关闭

在Rust 1.51中,您可以使用获取按值迭代器:

fn万岁(){
设数组=[1,4,3,2,2];
让array_iter=std::array::IntoIter::new(数组);
阵列滤波器(|&x | x==2);
}

对于任何元件类型
T
和常量
N
,阵列都是锈型
[T;N]
。这是一个固定大小的数组


Rust目前不适用于阵列。所有数组都强制执行切片(键入
[T]
),因此切片方法在数组上可用。数组还获得切片的迭代器,称为
std::slice::Iter,正如Shepmaster和bluss所说,您可以检查,其中提到:

大小从0到32(含)的数组实现以下功能 特征(如果元素类型允许):

  • intoierator
    (为
    &T;N]
    &mut[T;N]
    实现)

正如它所说的,这仅用于参考,并反映在它的
Item
type:
type Item=&a T
type Item=&a mut
中,谢谢!我之所以选择这个答案,是因为它让我了解了我可能是如何使用编译器自己来解决这个问题的。我也很感谢你提供的链接来了解更多信息。32的最大长度通常会从年起取消。