在Rust中,我们可以对各种集合使用.iter()
来创建一个不属于自己的迭代器,该迭代器返回对Vec这样的集合的引用.我们还可以使用.into_iter()
创建一个使用迭代器,然后返回移出集合的值..iter()
没有与.into_iter()
相同的特征,但我们可以通过对集合的引用调用.into_iter()
来实现相同的功能.
例如,此函数可以很好地编译:
fn test_vec(vec: Vec<i32>) {
let i1 = (&vec).into_iter(); // create a non-owning iterator
let i2 = (&vec).into_iter(); // create another one
let i3 = vec.into_iter(); // create an owning iterator which consumes the collection
// no more non-owning iterators can be created
}
我想使此函数成为泛型函数.我希望它不仅接受I32的VEC,还接受碰巧实现IntoIterator<;Item=I32&>的任何其他I32集合.
这样做似乎很简单,但是下面的泛型函数不再编译.
fn test_generic<T: IntoIterator<Item = i32>>(vec: T) {
let i1 = (&vec).into_iter(); // create a non-owning iterator
let i2 = (&vec).into_iter(); // create another one
let i3 = vec.into_iter(); // create an owning iterator which consumes the collection
// no more non-owning iterators can be created
}
编译失败,出现以下错误:
| let i1 = (&vec).into_iter(); // create a non-owning iterator
| ^^^^^^^-----------
| | |
| | value moved due to this method call
| move occurs because value has type `T`, which does not implement the `Copy` trait
|
note: this function takes ownership of the receiver `self`, which moves value
我不太理解错误的这一部分:
move occurs because value has type `T`, which does not implement the `Copy`
我不是要复制T类型的值,我是要复制&T类型的值,即对T的引用,而不是T本身.我认为您可以复制不变的引用而不会出现问题.为什么需要T而不是&;T来实施复制?