为什么有两种方法可以迭代矢量,IntoIterator和Iter?

时间:2016-08-13 08:06:25

标签: iterator rust

我有这个例子:

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)&Vec转换为IntoIterator, 在情况(2)中,我们只使用Iter

  1. 在潜在性能方面(编译器在优化模式下可以做什么)情况是否相同?

  2. 如果案件相同,为什么会引入IntoIterator?是否只是为了避免写.iter()

2 个答案:

答案 0 :(得分:3)

在这种情况下,它们是等效的,因为get_list会返回引用,因此IntoIteratoriter都会引用向量并返回对项的引用。

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

另见this answer

答案 1 :(得分:0)

1)在潜在性能方面是否相同(编译器在优化模式下可以做什么)? =&GT;不,它不是,它使用参考。

2)如果情况相同,为什么引入IntoIterator,只是为了不写.iter()? =&GT;它引用self.data而vector不是迭代器。