2015-06-26 7 views
11

Wenn ich die beiden FunktionenWann muss ich explizite Lebenszeiten in Rust angeben?

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

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

Wenn foo einen Fehler zurück und bar der korrekte Funktionskopf sein würden? Ich bin verwirrt, warum ich ausdrücklich ein Leben lang erklären würde:

Die ‚a liest‚die Lebensdauer a‘. Technisch gesehen hat jede Referenz eine Lebenszeit von , aber der Compiler erlaubt es Ihnen, sie in Fällen zu lösen.

Ich verstehe, was ein Leben lang, aber was explizit ein Leben lang 'atun für mich nicht spezifiziert? Als Referenz verwende ich die Rust book als Material

Antwort

10

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.

+4

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

+1

macht total Sinn, danke! –