我认为它应该是这样的,但我不能迭代借来的数组。
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());
^~~~~~~~~~~~~~
答案 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());
}