首页 文章

迭代器's next returns Some(&1). Why'那是什么?

提问于
浏览
3

这可能是一个愚蠢的问题,但它解决了我 .

我已经开始学习生锈了,来自全能的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 回答

  • 0

    因为他们是指针 . 按照文档 .

    • v1Vec<i32> . 所以 Ti32 .

    • Vec 没有 iter 方法 . 它确实 Deref[T] . 向下滚动 .

    • [T] 有一个iter方法 . 它返回 std::slice::Iter<T> .

    • v1_iterIter<i32>,所以 Ti32 .

    • nextIterator 特性的一部分,因此向下滚动并查找impl Iterator部分 .

    • 在下面,它指定 next 返回 Option<&'a T> . 替换 T ,这会给你 Option<&'a i32> .

    先发制人:他们为什么指点?

    因为那就是你要求的 . 如果要通过迭代器移出 Vec 的内容,则需要使用 Vec::into_iterVec::drain .

  • 4

    函数 Vec::iter() 的类型为 (self :&Vec<T>) -> Q<&T> . 也就是说,它创建了一个类型为 Q 的迭代器,这里的迭代器并不重要,它迭代了对 VecT 元素的引用 . 它使用对 Vec 的不可变引用,因此它根本不会占用任何元素或对 Vec 产生任何影响 .

    所有 Iterator 都有一个 cloned() 方法,只要 T 具有 Clone 特性,就可以将 &T 引用上的迭代器转换为超过 T 值的迭代器 . 它将另一个迭代器包装在一些代码中,这些代码在对元素的所有引用上调用 clone() 方法,将它们转换为新的 T .

    fn iterator_demonstration() {
        let v1 = vec![1, 2, 3];
    
        let mut v1_iter = v1.iter().cloned();
    
        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);
    }
    

    Vec 也实现了 IntoIterator ,它将 Vec 消耗到 T 上的迭代器中,占用了 Vec 中的所有 T 并将它们传回 . 它会破坏 Vec 并获取其所有 T 值的所有权 . 您可以使用 into_iter() 方法显式使用它,它也用于for循环 .

    fn iterator_demonstration2() {
        let v1 = vec![1, 2, 3];
    
        let mut v1_iter = v1.into_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);
    }
    
    
    fn iterator_demonstration3() {
        let v1 = vec![1, 2, 3];
        for i in v1 {
            println!("{}", i);
        }
    }
    

相关问题