这可能是一个愚蠢的问题,但它解决了我 .
我已经开始学习生锈了,来自全能的book . 在迭代器章节(其中链接的那一章)中,有以下示例
fn iterator_demonstration() {
let v1 = vec![1, 2, 3];
let mut v1_iter = v1.iter();
assert_eq!(v1_iter.next(), Some(&1));
assert_eq!(v1_iter.next(), Some(&2));
assert_eq!(v1_iter.next(), Some(&3));
assert_eq!(v1_iter.next(), None);
}
这本书有点茫然,但我想知道 - 为什么需要&符号?
编辑:只是澄清 - 我明白 iter
迭代通过不可变引用 . 我只是不太了解引用数字文字(再次,菜鸟问题 . )
2 回答
因为他们是指针 . 按照文档 .
v1
是Vec<i32> . 所以T
是i32
.Vec
没有iter
方法 . 它确实Deref
到[T]
. 向下滚动 .[T]
有一个iter方法 . 它返回std::slice::Iter<T>
.v1_iter
是Iter<i32>,所以T
是i32
.next
是Iterator
特性的一部分,因此向下滚动并查找impl Iterator部分 .在下面,它指定
next
返回Option<&'a T>
. 替换T
,这会给你Option<&'a i32>
.因为那就是你要求的 . 如果要通过迭代器移出
Vec
的内容,则需要使用Vec::into_iter
或Vec::drain
.函数
Vec::iter()
的类型为(self :&Vec<T>) -> Q<&T>
. 也就是说,它创建了一个类型为Q
的迭代器,这里的迭代器并不重要,它迭代了对Vec
中T
元素的引用 . 它使用对Vec
的不可变引用,因此它根本不会占用任何元素或对Vec
产生任何影响 .所有
Iterator
都有一个cloned()
方法,只要T
具有Clone
特性,就可以将&T
引用上的迭代器转换为超过T
值的迭代器 . 它将另一个迭代器包装在一些代码中,这些代码在对元素的所有引用上调用clone()
方法,将它们转换为新的T
.Vec
也实现了IntoIterator
,它将Vec
消耗到T
上的迭代器中,占用了Vec
中的所有T
并将它们传回 . 它会破坏Vec
并获取其所有T
值的所有权 . 您可以使用into_iter()
方法显式使用它,它也用于for循环 .