Praktisch lesen, die # 1 Grund Sie Lebensdauer Anmerkungen schreiben ist weil der Compiler Sie so fragt. Es werden Funktionssignaturen zurückgewiesen, die nicht von lifetime elision rules abgedeckt sind.
Ich nehme an, Sie möchten ein einfaches Beispiel, wo Lebensdauern obligatorisch sind. Stellen Sie sich folgendes Szenario vor:
struct Blah<'a> {
hoy: &'a u8
}
fn want_a_hoy(blah: &Blah) -> &u8 {
blah.hoy
}
Die Absicht ist offensichtlich, aber der Compiler nicht verarbeitet:
<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
In diesem Fall Anmerkungen das Problem zu lösen:
fn want_a_hoy<'a, 'b>(blah: &'b Blah<'a>) -> &'a u8 {
blah.hoy
}
Hier Sie geben 'a
zweimal an (unter und &'a
). Dies ist das gleiche Leben! Was du also dem Compiler sagst, ist: "Diese Funktion nimmt Bezug auf ein Blah, das eine innere Referenz enthält. Ich werde etwas zurückgeben, das genauso lange lebt wie die innere Referenz des Blahs." In diesem Fall gibt die Unterschrift einen starken Hinweis, dass Sie wahrscheinlich etwas zurückgeben werden, das von den Innereien des Blahs kommt.
Ein noch einfacheres Beispiel, bei dem die Lebensdauereliminierung fehlschlägt, ist 'fn pick_one (a: & T, b: & T) -> & T' (auch wenn immer einer von ihnen bedingungslos zurückgegeben wird). – delnan
macht total Sinn, danke! –