Rust - for in 遍历数组的几种方式

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);
}

posted @ 2026-01-01 16:52  店里最会撒谎白玉汤  阅读(3)  评论(0)    收藏  举报