今回のソースコード
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); }