我有这样一个例子:
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
。
在潜在性能方面是否相等(编译器在优化模式下可以做什么)?
如果情况相同,为什么要引入
IntoIterator
?是不是为了避免写.iter()
?
在本例中,它们是等价的,因为get_list
返回一个引用,所以IntoIterator
和iter
都接受对vector的引用,并返回对item的引用。
如果vector是被拥有的,它将被移到IntoIterator
中(因此得名),并从vector返回被拥有的元素。另一方面,iter
总是接受引用并返回对项的引用。
1)在潜在性能方面是否相等(编译器在优化模式下可以做什么)?=>不,它使用引用。
2)如果情况相等,为什么引入IntoIterator,只是为了不写。iter()?=>它引用self。