fn main() {
let arr = [1, 2, 3, 4, 5];
// 不获取所有权
// for item in &arr 与 for item in arr.iter() 等价
for item in &arr{
println!("{} = {}", item, *item); // item 的类型是&i32
}
for item in arr.iter() {
println!("{} = {}", item, *item); // item 的类型是&i32
}
let arr2 = ["a".to_string(), "a".to_string(), "a".to_string()];
// 获取所有权
// for item in arr 和 for item in arr.into_iter等价
for item in arr2 {
println!("{}", item); // item 的类型是i32
}
// borrow of moved value: `arr2`
// value borrowed here after mov
// println!("arr2.len = {}", arr2.len()); // arr2的所有权发生了转移
// println!("{:?}", arr2.last());
let arr3 = [1, 2, 3, 4, 5];
for item in arr3.into_iter() {
println!("{}", item); // item 的类型是i32
}
println!("arr3.len = {}", arr3.len()); // i32实现了copy类型,所有在迭代时是复制而不是所有权转移
println!("{:?}", arr3.last());
// 修改数组元素,但不获取所有权
// for item in &mut arr3 和 for item in arr3.iter_mut 等价
let mut arr3 = [1, 2, 3, 4, 5];
for item in &mut arr3 {
*item *= 2; // item的类型是&mut i32
}
println!("{:?}", arr3); // 2, 4, 6, 8, 10
for item in arr3.iter_mut() {
*item /= 2;
}
println!("{:?}", arr3); // 1, 2, 3, 4, 5
// 获取引用的所有权
// for item in (&arr).into_iter 实际是for item in &arr
// 明确将引用转换为迭代器
// 获取引用的所有权,而不是数组的所有权
// 是 for item in &arr的底层展开形式
let mut arr4 = [1, 2, 3, 4, 5];
for item in (&mut arr4).into_iter() {
*item *= 3; // item的类型是&mut i32
}
println!("{:?}", arr4);
let arr5 = [String::from("abc"), String::from("def")];
for item in (&arr5).into_iter() {
println!("{}", item); // item的类型是&String
}
println!("{:?}", arr5);
}