capypad
0 Tage Serie
rust / beginner
Snippet

Grundlegende Lifetime-Annotationen

Lifetimes stellen sicher, dass Referenzen so lange gültig bleiben wie nötig. Die 'a Annotation sagt, dass beide Eingaben und die Ausgabe die gleiche Lebenszeit teilen. Der Compiler nutzt dies um hängende Referenzen zu verhindern.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
 
fn main() {
let s1 = String::from("long string");
let result;
{
let s2 = String::from("xyz");
result = longest(s1.as_str(), s2.as_str());
println!("Longest: {}", result);
}
}
Erklärung
1
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str
'a deklariert einen Lifetime-Parameter; beide Eingaben überleben 'a
2
if x.len() > y.len() { x } else { y }
Gibt eine Referenz zurück, die 'a nicht überleben darf
3
result = longest(s1.as_str(), s2.as_str());
Übergibt geliehene String-Slices, keine besessenen Werte
4
println! läuft bevor s2 am Blockende fällt
result wird verwendet während beide geliehenen Referenzen noch gültig sind