2015-04-25 4 views
15

In Rust, wenn wir eine Struktur wollen Referenzen enthalten, definieren wir typischerweise ihrem Leben als solche:Wann ist es sinnvoll, mehrere Lebenszeiten in einer Struktur zu definieren?

struct Foo<'a> { 
    x: &'a i32, 
    y: &'a i32, 
} 

Aber es ist auch möglich, mehrere Lebensdauern für verschiedene Referenzen in der gleichen Struktur zu definieren:

struct Foo<'a, 'b> { 
    x: &'a i32, 
    y: &'b i32, 
} 

Wann ist es jemals sinnvoll, dies zu tun? Kann jemand einen Beispielcode bereitstellen, der nicht kompiliert wird, wenn beide Lebensdauern 'a sind, aber kompiliert, wenn die Lebensdauern 'a und 'b sind (oder umgekehrt)?

Antwort

9

Nachdem ich viel zu spät aufgestanden bin, konnte ich mir einen Fallbeispiel ausdenken, bei dem es auf die Lebensdauer ankommt. Hier ist der Code:

static ZERO: i32 = 0; 

struct Foo<'a, 'b> { 
    x: &'a i32, 
    y: &'b i32, 
} 

fn get_x_or_zero_ref<'a, 'b>(x: &'a i32, y: &'b i32) -> &'a i32 { 
    if *x > *y { 
     return x 
    } else { 
     return &ZERO 
    } 
} 

fn main() { 
    let x = 1; 
    let v; 
    { 
     let y = 2; 
     let f = Foo { x: &x, y: &y }; 
     v = get_x_or_zero_ref(&f.x, &f.y); 
    } 
    println!("{}", *v); 
} 

Wenn Sie die Definition von Foo zu, dies zu ändern sind:

struct Foo<'a> { 
    x: &'a i32, 
    y: &'a i32, 
} 

Dann wird der Code nicht kompilieren.

Grundsätzlich, wenn Sie die Felder der Struktur für eine Funktion verwenden möchten, die erfordert, dass ihre Parameter unterschiedliche Lebensdauern haben, müssen die Felder der Struktur auch unterschiedliche Lebensdauern haben.

+6

Hahahaha! Ich schrieb mehr oder weniger genau das gleiche, dann hatte ich vor 15 Stunden einen Stromausfall. Ich war gerade dabei, es zu posten. Ja, über den einzigen Fall, den ich mir vorstellen kann, ist, wenn Sie in der Lage sein wollen, einen Gesamtwert zu nehmen und Teile davon nach der Verwendung abzutrennen, ohne lebenslange Informationen zu verlieren. Denken Sie daran, ein Bündel von Werten aufzubauen (was Lebensdauern beinhalten könnte), indem Sie es verwenden und anschließend die ursprünglichen Werte wiederherstellen. –

+2

Das 'b in get_x_or_zero_ref kann natürlich weggelassen werden, da es durch die Standard-Lebensdauer-Elisionsregeln impliziert wird. – bluss

+2

Es macht keinen Sinn zu sagen, dass eine Funktion "erfordert", dass ihre Parameter unterschiedliche Lebensdauern haben. Der Zweck der Lebensdauerparameter besteht darin, zu verhindern, dass die Funktion oder Struktur diese Parameter in eine einzige (abgeleitete) Lebensdauer vereinheitlicht, so dass der Border-Checker zwischen ihnen unterscheiden kann – trentcl

Verwandte Themen