Rustのlifetime
lifetime, 生存期間
参考
/mrsekut-book-4295015296/383 (第23章 借用とライフタイム)
良い
/mrsekut-book-4297105594/291 (7-8 参照のライフタイムと借用規則)
/mrsekut-book-4297105594/282 (7-3 値の所有者)
#wip
おさらい
lifetimeを理解するためには、前提として値のスコープを把握してないといけない
なぜか、「lifetime」と聞くと、真っ先に'aの型のやつが頭に浮かぶようになってしまっていたが、
それはlifetimeが扱う範囲の一部であることを思い出すと良い
昔に中途半端な理解をしたのが原因mrsekut.icon
こういう雑な階層構造がある
lifetime
値のlifetime
参照のlifetime
....
関数に関するもの
ここで'aとかが出てくる
/mrsekut-book-4295015296/383 (第23章 借用とライフタイム)
もっかいよもう
整理する気合を出す前にバテた
あと今書いていたプログラムに特に必要がないということに途中で気づいてモチベがなくなった
/mrsekut-book-4295015296/399 (23.8 ライフタイム指定の有効性をチェックする)から未読
/mrsekut-book-4295015296/406 (第24章 さらにライフタイムについて)
2種類ある
値のlifetime
参照のlifetime
値への参照が使用される期間
その値を使う最後の文の直後で終わる
dropが呼ばれたりはしない、何も起こらない
関数では、ライフタイム指定子を使って記述する
'aは「tick A」と発音するらしい
/mrsekut-book-4295015296/389 (23.3 オブジェクトのライフタイム(生存期間))
2種類ある
Lexical Lifetime (古い)
Non-Lecical Lifetime (NLL)
借用における2つの制約
「型」のイメージ通り、指定された生存期間よりも、長い期間生存する参照しか受け付けない
つまり、型で表現されている生存期間は、必要とする生存期間の最短値になっているのかmrsekut.icon
Rustのプログラムの中で最も長い生存期間は'static
開始してから終了するまでの期間を表している
関数周りの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への参照のみを引数に取ることができる
参考
/mrsekut-book-4873118557/118 (5章 参照)
https://github.com/pretzelhammer/rust-blog/blob/master/posts/translations/jp/common-rust-lifetime-misconceptions.md