【问题标题】:Why are there two ways to iterate over a vector, IntoIterator and Iter?为什么有两种方法可以迭代向量,IntoIterator 和 Iter?
【发布时间】:2016-08-13 08:06:24
【问题描述】:

我有这个例子:

struct Foo { data: Vec<u32> }
impl Foo {
    fn get_list(&self) -> &Vec<u32> {
        &self.data
    }
}

fn main() {
    let foo = Foo { data: vec![1, 2, 3] };

    // 1
    for it in foo.get_list() {
        println!("IntoIter {}", *it);
    }

    // 2
    for it in foo.get_list().iter() {
        println!("Iter {}", *it);
    }
}

据我了解,万一(1)&amp;Vec转换为IntoIterator, 在情况(2)中,我们只使用Iter

  1. 就潜在性能而言,这些情况是否相同(编译器在优化模式下可以做什么)?

  2. 如果情况相同,为什么要引入IntoIterator?是为了避免写.iter()吗?

【问题讨论】:

    标签: iterator rust


    【解决方案1】:

    在这种情况下它们是等价的,因为get_list 返回一个引用,所以IntoIteratoriter 都采用对向量的引用并返回对项的引用。

    如果向量被拥有,它将被移动到IntoIterator(因此得名)并从向量返回拥有的项目。另一方面,iter 总是接受引用并返回对项目的引用。

    另见this answer

    【讨论】:

      【解决方案2】:

      1) 就潜在性能而言,情况是否相等(编译器在优化模式下可以做什么)? => 不,不是,它使用引用。

      2) 如果情况相同,为什么要引入 IntoIterator,而不是编写 .iter()? => 它引用了 self.data 并且 vector 不是一个迭代器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-28
        • 1970-01-01
        • 2013-11-05
        • 2010-10-25
        • 2014-02-16
        • 1970-01-01
        • 2011-04-25
        • 2021-12-20
        相关资源
        最近更新 更多