Rustのライフタイム


Rustにはライフタイムという概念があります。

それはリソースの安全な管理を実現するために存在しているのですが、
これが意外とややこしいのものです。

ドキュメントにもまとめらていますが、
ここで噛み砕いて簡単にまとめたいと思います。


ライフタイムがしてくれること


Aというリソースがあり、それに対する参照をBが持つとします。
これでBはAの値にアクセスすることができます。

しばらくしてAが役目を終え解放されたあとにBがAを使用するようなことがあった場合、
BはNULLを参照することになってしまいます。
これはプログラムがクラッシュする原因になります。

ライフタイムはこのような現象を防ぐための役割を担っています。


ライフタイムの宣言


簡単な例を見ていきましょう。


func関数はi32型の参照を受け取ります。
関数内で10倍したあと処理を終えます。

先に挙げた例で言うと、
main関数内で宣言されたxがAにあたり、
func関数の引数であるy: &mut i32がBとなります。

‘aという記述があります。(aの部分は任意の文字)
これがライフタイムの宣言です。

この宣言によってBはAよりも長く存在しないということを示します。
これのおかげでfunc関数内でyを使用している間はxの値に対してアクセスできるということが保証されます。

ちなみにサンプルのfunc関数はこのような書き方もできます。


‘aの宣言を省略することができます。


しかし構造体を使う場合は明示的に宣言する必要があります。


これだとコンパイルできません。


ライフタイムを宣言しましょう。


ちなみに参照が複数ある場合、その数だけライフタイムを宣言する必要があります。

ピンとこない場合


error[E0106]: missing lifetime specifierのメッセージとともに、
ライフタイムを宣言するべき場所をコンパイラが指定しくれますので、
それに従っておきましょう。

僕はそうしています。

いずれ理解できる気がします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です