Rustのlifetime
おさらい
lifetimeを理解するためには、前提として値のスコープを把握してないといけない
なぜか「lifetime」と聞くと、真っ先に'aの型のやつが頭に浮かぶようになってしまっていたが、
それはlifetimeが扱う範囲の一部であることを思い出すと良い
昔に中途半端な理解をしたのが原因mrsekut.icon
こういう雑な階層構造がある
lifetime
....
関数に関するもの
ここで'aとかが出てくる
2種類ある
参考
良い
もっかいよもう
整理する気合を出す前にバテた
あと今書いていたプログラムに特に必要がないということに途中で気づいてモチベがなくなった
「型」のイメージ通り、指定された生存期間よりも、長い期間生存する参照しか受け付けない
つまり、型で表現されている生存期間は、必要とする生存期間の最短値になっているのかmrsekut.icon
関数周りのlifetimeについて
参照を返す関数の借用チェックは、関数の型の情報だけを見ている
関数のbodyは見てない
だから、関数ではerrorになるが、inline化するとerrorが消えるケースも存在する
関数内で参照できるobjectは5種類あり、関数が返す参照はそのうちの2つ
④静的オブジェクトの借用
⑤引数の借用
借用チェッカは、関数の返す参照の内、どれが④でどれが⑤なのかを判断できないといけない
解説の仕方がきれいに整備されていて納得感があるmrsekut.icon
なんで関数にlifetimeの指定が必要なのか、の意味がわかりやすい
例
code:rs
fn f<'a>(p: &'a i32) { ... }
関数fの生存期間より短い生存期間であるi32型への参照のみを引数に取ることができる
例
code:rs
fn f(p: &'static i32) { ... }
生存期間が'staticと同じ期間あるi32への参照のみを引数に取ることができる
ライフタイムの型の省略規則
規則1: 各引数に別々のライフタイムを振る
code:rust
fn foo(a: &str, b: &str)
// → fn foo<'a, 'b>(a: &'a str, b: &'b str)
規則2: 引数の & が1つだけなら、返り値もそのライフタイム
code:rust
fn short_id(id: &str) -> &str
// 規則1: fn short_id<'a>(id: &'a str) -> &str
// 規則2: fn short_id<'a>(id: &'a str) -> &'a str ← 自動で決まる
規則3: &self か &mut self があれば、返り値はそのライフタイム
code:rust
fn title(&self) -> &str
// → fn title<'a>(&'a self) -> &'a str
省略できないケース
引数に & が2つ以上あって self もない場合:
code:rust
fn longest(a: &str, b: &str) -> &str // コンパイルエラー!
規則1で 'a と 'b が振られるが、返り値がどっちかわからない。明示が必要:
code:rust
fn longest<'a>(a: &'a str, b: &'a str) -> &'a str // OK
参考