我如何迭代借来的数组?

时间:2015-05-28 22:59:17

标签: reference iterator rust

我认为它应该是这样的,但我不能迭代借来的数组。

fn print_me<'a, I>(iter: &'a I) where I: Iterator<Item = i32> {
    for i in *iter {
        println!("{}", i);
    }
}

fn main() {
    let numbers = vec![1, 2, 3];
    //let numbers = &numbers;
    print_me(numbers.iter());
}

但Rust抱怨道:

<anon>:15:12: 15:26 error: mismatched types:
 expected `&_`,
    found `core::slice::Iter<'_, _>`
(expected &-ptr,
    found struct `core::slice::Iter`) [E0308]
<anon>:15   print_me(numbers.iter());
                     ^~~~~~~~~~~~~~

1 个答案:

答案 0 :(得分:3)

迭代器是一个常规对象;您直接使用迭代器,而不是通常通过引用 - 当然通常不通过不可变引用,因为获取迭代器的下一个值需要&mut self。并且对迭代器的引用与引用的迭代器完全不同。

修复此部分,然后你有了这个:

fn print_me<I: Iterator<Item = i32>>(iter: I) {
    for i in iter {
        println!("{}", i);
    }
}

但这并不能解决所有问题,因为[T].iter()会生成一个实现Iterator<Item = &T>的类型 - 它会将引用迭代到每个项目。最常见的解决方法是使用方便的.cloned()方法克隆每个值,该方法相当于.map(|x| x.clone())

然后,这是你最终的其余部分:

fn main() {
    let numbers = vec![1, 2, 3];
    print_me(numbers.iter().cloned());
}