13

私が2つの機能を持っている場合

// implicit
fn foo(x: &i32) {
}

// explicit
fn bar<'a>(x: &'a i32) {
}

エラーをfoo返し、bar正しい関数ヘッダーになるのはいつですか? なぜ生涯を明示的に宣言するのか、私は混乱しています:

「a」は「生涯 a」と読みます。技術的には、すべての参照にはライフタイムが関連付けられていますが、一般的なケースではコンパイラによってそれらを省略できます。

ライフタイムが何であるかは理解していますが、ライフタイムを明示的に指定すると'a どうなりますか? 参考までに、Rustの本を読み物として使用しています

4

1 に答える 1

11

実際に言えば、ライフタイム アノテーションを書かなければならない一番の理由は、コンパイラがそうするように要求するからです。有効期間の省略規則でカバーされていない関数シグネチャは拒否されます。

ライフタイムが必須である簡単な例が必要だと思います。次のシナリオを想像してください。

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
}

ここでは、 'a2 回 (onBlah<'a>&'a) を指定しています。これは同じ生涯です!つまり、ここでコンパイラに言っているのは、「この関数は、内部参照を含む何とかへの参照を取ります。私は、何とかの内部参照とまったく同じくらい存続するものを返します。」この場合、署名は、何かの内部から何かを返す可能性が高いという強力なヒントを与えます.

于 2015-06-27T00:38:55.630 に答える