Rustのlifetime
lifetime, 生存期間
おさらい
lifetimeを理解するためには、前提として値のスコープを把握してないといけない
なぜか「lifetime」と聞くと、真っ先に'aの型のやつが頭に浮かぶようになってしまっていたが、
それはlifetimeが扱う範囲の一部であることを思い出すと良い
昔に中途半端な理解をしたのが原因mrsekut.icon
こういう雑な階層構造がある
lifetime
値のlifetime
参照のlifetime
....
関数に関するもの
ここで'aとかが出てくる
2種類ある
Lexical Lifetime (古い)
Non-Lecical Lifetime (NLL)
参考
/mrsekut-book-4295015296/383 (第23章 借用とライフタイム)
良い
/mrsekut-book-4297105594/291 (7-8 参照のライフタイムと借用規則)
/mrsekut-book-4297105594/282 (7-3 値の所有者)
#wip
/mrsekut-book-4295015296/383 (第23章 借用とライフタイム)
もっかいよもう
整理する気合を出す前にバテた
あと今書いていたプログラムに特に必要がないということに途中で気づいてモチベがなくなった
/mrsekut-book-4295015296/399 (23.8 ライフタイム指定の有効性をチェックする)から未読
/mrsekut-book-4295015296/406 (第24章 さらにライフタイムについて)
借用における2つの制約
「型」のイメージ通り、指定された生存期間よりも、長い期間生存する参照しか受け付けない
つまり、型で表現されている生存期間は、必要とする生存期間の最短値になっているのかmrsekut.icon
関数周りのlifetimeについて
/mrsekut-book-4295015296/393 (23.6 関数から返された参照にライフタイム指定が必要な理由)
参照を返す関数の借用チェックは、関数の型の情報だけを見ている
関数のbodyは見てない
だから、関数ではerrorになるが、inline化するとerrorが消えるケースも存在する
/mrsekut-book-4295015296/396 (23.7 ライフタイム指定の用法と意味)
関数内で参照できるobjectは5種類あり、関数が返す参照はそのうちの2つ
④静的オブジェクトの借用
'static
⑤引数の借用
lifetime specifierを使ってどの引数とどの返り値のlifetimeが対応しているかを示す
借用チェッカは、関数の返す参照の内、どれが④でどれが⑤なのかを判断できないといけない
解説の仕方がきれいに整備されていて納得感がある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
参考
/mrsekut-book-4873118557/118 (5章 参照)
https://github.com/pretzelhammer/rust-blog/blob/master/posts/translations/jp/common-rust-lifetime-misconceptions.md