実際に言えば、ライフタイム アノテーションを書かなければならない一番の理由は、コンパイラがそうするように要求するからです。有効期間の省略規則でカバーされていない関数シグネチャは拒否されます。
ライフタイムが必須である簡単な例が必要だと思います。次のシナリオを想像してください。
struct Blah<'a> {
hoy: &'a u8
}
fn want_a_hoy(blah: &Blah) -> &u8 {
blah.hoy
}
意図は明らかですが、コンパイラはそれを処理しません。
<anon>:7:35: 7:38 error: missing lifetime specifier [E0106]
<anon>:7 fn want_a_hoy(blah: &Blah) -> &u8 {
^~~
<anon>:7:35: 7:38 help: see the detailed explanation for E0106
<anon>:7:35: 7:38 help: this function's return type contains a borrowed value, but
the signature does not say which one of `blah`'s 2 elided
lifetimes it is borrowed from
この場合、注釈が問題を解決します。
fn want_a_hoy<'a, 'b>(blah: &'b Blah<'a>) -> &'a u8 {
blah.hoy
}
ここでは、 'a
2 回 (onBlah<'a>
と&'a
) を指定しています。これは同じ生涯です!つまり、ここでコンパイラに言っているのは、「この関数は、内部参照を含む何とかへの参照を取ります。私は、何とかの内部参照とまったく同じくらい存続するものを返します。」この場合、署名は、何かの内部から何かを返す可能性が高いという強力なヒントを与えます.