以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> { }