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.
Oh, der Ausgang muss vereinheitlichen, wenn er von beiden Eingängen abhängt. – Snark