ざっくりライフタイムの使い所
- 借用するときに使える (&とほぼペア)
ライフタイムの例
ライフタイムで参照を有効化する - The Rust Programming Language
ここによると以下の例の時、スコープ終了した後なのに参照しようとしているのでエラーとなる
{ let r; { let x = 5; r = &x; } println!("r: {}", r); // error }
ライフタイム VS スコープ
ライフタイムとスコープは同時に語られることが多いですが、同じものではありません。
今までは同じようなものかと思っていたし、スコープ外だから参照持ってたらいけないのは当たり前なのではと思っていのですが、ライフタイムを明示することで、生存期間を伸ばすことが可能みたいです。
上のコードにライフタイムを明示してあげると、xのライフタイムが伸び、rが参照できるようになりました。
fn takoyaki<'a>() { let r: &'a i32; { let x: &'a i32 = &5; r = x; } // println!("x: {}", x); // error: cannot find value `x` in this scope println!("r: {}", r); // ok! ライフタイム伸びた! }
xは外側からは参照できないので、「ライフタイム ≠ スコープ」という図式になりました。
余談
let r: 'a i32;
ができると思って書いてたらエラーが出て、かなりの時間困っていました!
ライフタイムは借用とセットなので&がいることに気づかなかった・・・