2016-05-25 8 views

Antwort

2

Es hängt wirklich von Ihrem Anwendungsfall ab. Aufgrund der genauen Code, den Sie schrieb:

fn xory<'a>(x: &'a str, y: &'a str) -> &'a str { 
    x 
} 

Hier ist es ein Nachteil, nur eine Lebensdauer zu verwenden, da der Rückgabewert hängt nur von der x Argument, nicht auf dem y ein. Lassen Sie uns diesen Benutzercode vorstellen:

let x_in = "paul".to_owned(); 
let out = { 
    let y_in = "peter".to_owned(); 
    xory(&x_in, &y_in) 
}; 

Wir würden erwarten, dass dies funktioniert gut, weil out grundsätzlich x_in ist. Aber der Compiler beschwert:

<anon>:12:22: 12:26 error: `y_in` does not live long enough 
<anon>:12   xory(&x_in, &y_in) 
           ^~~~ 
<anon>:13:7: 14:2 note: reference must be valid for the block suffix following statement 1 at 13:6... 
<anon>:13  }; 
<anon>:14 } 
<anon>:11:39: 13:6 note: ...but borrowed value is only valid for the block suffix following statement 0 at 11:38 
<anon>:11   let y_in = "peter".to_owned(); 
<anon>:12   xory(&x_in, &y_in) 
<anon>:13  }; 

Dies liegt daran, der Compiler übernimmt (von dem xory Signatur), dass die Ausgabe von xory Referenzen beider Argumenten. Daher ist es oft besser, Lebenszeiten so detailliert wie möglich zu spezifizieren, um unnötige Bedingungen/Annahmen/Beziehungen zwischen Parametern zu vermeiden.


In einigen Fällen brauchen Sie nur ein Leben lang (oder eine etwas andere Lösung) zu verwenden: Angenommen, Sie zurückkehren wollen entweder x oder y abhängig von einer Bedingung:

fn xory<'a>(x: &'a str, y: &'a str) -> &'a str { 
    if x.len() == 42 { 
     x 
    } else { 
     y 
    } 
} 

Hier die Lebensdauer Die Ausgabe kann von den Lebensdauern beider Argumente abhängen und wir wissen nicht, auf welcher zur Laufzeit der Argumente. Deshalb müssen wir uns auf das Schlimmste vorbereiten und es so machen.

+0

Oh, der Ausgang muss vereinheitlichen, wenn er von beiden Eingängen abhängt. – Snark

1

Mit der gleichen Lebensdauer sagen Sie, dass der Rückgabewert entweder von x oder y ausgeliehen werden könnte, also aus der Sicht des Funktionskörpers ist es flexibler. Vom Aufrufer ist es restriktiver, da sowohl x als auch y so lange gültig sein müssen, wie das Ergebnis beibehalten wird, anstatt nur x (sagen wir).

Verwandte Themen