スタティックライフタイム
Rustにはいくつかの予約されたライフタイム名があります。その1つがstatic
で、2つの状況で使用することがあります。
2つの状況におけるstatic
は微妙に異なる意味を持っており、Rustを学ぶときの混乱の元になっています。
いくつかの例とともにそれぞれの使い方を見てみましょう。
参照のライフタイム
参照のライフタイムが'static
であることは、参照が指し示す値がプログラムの実行中に渡って生き続けることを示します。
また、より短いライフタイムに圧縮することも可能です。
'static
ライフタイムを持つ変数を作るには下記の2つ方法があります。
どちらの場合も、値は読み取り専用のメモリ領域に格納されます。
static
宣言とともに定数を作成する。- 文字列リテラルで
&'static str
型を持つ変数を作成する。
では、それぞれの方法の例を見ていきましょう。
トレイト境界
トレイト境界としての'static
は型が非静的な参照を含まないことを意味します。
言い換えると、レシーバはその型をいくらでも長く保持することができ、意図的にドロップするまでは決して無効になることはないということです。
次のポイントを押さえておきましょう。所有権のある値が'static
ライフタイム境界をパスするとしても、その値への参照が'static
ライフタイム境界をパスするとは限りません。
コンパイラのメッセージはこのようになります、
error[E0597]: `i` does not live long enough
エラー[E0597]: `i`は十分なライフタイムを持っていません
--> src/lib.rs:15:15
|
15 | print_it(&i);
| ---------^^--
| | |
| | borrowed value does not live long enough
| | 借用した値のライフタイムが不足
| argument requires that `i` is borrowed for `'static`
| 引数は`i`が`'static`として借用されることを要求する
16 | }
| - `i` dropped here while still borrowed
| `i`は借用されたままここでドロップされる