我有这个例子:
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()
?
答案 0 :(得分:3)
在这种情况下,它们是等效的,因为get_list
会返回引用,因此IntoIterator
和iter
都会引用向量并返回对项的引用。
如果向量被拥有,它将被移动到IntoIterator
(因此名称)并从向量中返回拥有的项目。另一方面,iter
总是接受引用并返回对项的引用。
另见this answer。
答案 1 :(得分:0)
1)在潜在性能方面是否相同(编译器在优化模式下可以做什么)? =&GT;不,它不是,它使用参考。
2)如果情况相同,为什么引入IntoIterator,只是为了不写.iter()? =&GT;它引用self.data而vector不是迭代器。