ベクタ型内の要素をループ内で借用してループの外で使う場合はベクタ変数を借用してループを回そう

今回のソースコード

struct A {
    val: i32,
}

fn main() {
    let mut a_list: Vec<A> = vec![];
    for i in 1..10 {
        a_list.push(A { val: i });
    }

    let mut inner_elem = &A { val: 0 };

    for a in a_list {
        match a.val {
            3 => inner_elem = &a,
            _ => {}
        }
    }

    println!("{}", inner_elem.val);
}

上記のようにベクタ型変数の要素をループの中で借用してループのスコープの外の変数に束縛するとコンパイルエラーが発生します。

   |
16 |             3 => inner_elem = &a,
   |                               ^^ borrowed value does not live long enough
...
20 |     }
   |     - `a` dropped here while still borrowed
21 | 
22 |     println!("{}", inner_elem.val);
   |                    -------------- borrow later used here

こういう場合は、ループを回すおおもとのベクタ変数を借用して回すと解決します。

struct A {
    val: i32,
}

fn main() {
    let mut a_list: Vec<A> = vec![];
    for i in 1..10 {
        a_list.push(A { val: i });
    }

    let mut inner_elem = &A { val: 0 };

    for a in &a_list {
        //   ^ ここの & が無いとコンパイルエラーが発生する。
        match a.val {
            3 => inner_elem = &a,
            _ => {}
        }
    }

    println!("{}", inner_elem.val);
}