以i32列表为例:
let nums = vec![1,2,3,4];
iter()
通过iter()调用得到的迭代器,其中迭代的是nums数组中元素的的引用(借用)。
// 可以看到,闭包中的参数x前面带有引用&符号
let borrowed_values = nums.iter().for_each(|&x| {
println!("{}", x);//x为i32类型
});
into_iter()
通过into_iter()调用得到的迭代器,其中迭代的是nums数组中元素本身(占据所有权)。
调用nums.into_iter()之后,nums变量的所有权会被转移走,无法再次使用nums。
let nums = vec![1,2,3,4];
// 迭代器中迭代的是nums数组中元素本身(占据所有权)
let owned_values = nums.into_iter().for_each(|x| {
println!("{}", x);
});
// 下面这行代码编译不过:borrow of moved value: `nums`,即nums所有权已被转移走
println!("{:?}", nums);
对比iter()和into_iter()函数签名
对比函数签名,iter()中传入的是self的引用;into_iter()中传入的是self本身,会将所有权转移到此函数调用内部。
pub fn iter(&self) -> Iter<'_, T> { }
fn into_iter(self) -> IntoIter<T, A> { }
本文对比了Rust语言中iter()和into_iter()两种不同类型的迭代器。iter()返回一个借用迭代器,允许遍历集合而不改变其内容;into_iter()则返回一个消费型迭代器,遍历时获取元素的所有权,并且原始集合不再可用。文章通过具体示例解释了这两种迭代器的区别。
798

被折叠的 条评论
为什么被折叠?



