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