为什么有两种方法迭代vector, IntoIterator和Iter ?



我有这样一个例子:

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() ?

在本例中,它们是等价的,因为get_list返回一个引用,所以IntoIteratoriter都接受对vector的引用,并返回对item的引用。

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

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

2)如果情况相等,为什么引入IntoIterator,只是为了不写。iter()?=>它引用self。

最新更新