capypad
0 Tage Serie
rust / intermediate
Snippet

Lifetimes in Funktionssignaturen

Lifetimes geben an, wie lange Referenzen in Ihrem Code gültig sind. Wenn Funktionen Referenzen zurückgeben, muss Rust die Beziehung zwischen Eingabe- und Ausgabe-Lifetimes kennen. Lifetime-Annotationen erstellen Verträge, die sicherstellen, dass Referenzen nicht länger existieren als die Daten, auf die sie zeigen.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() { x } else { y }
}
 
fn first_word(s: &str) -> &str {
match s.find(' ') {
Some(i) => &s[..i],
None => s,
}
}
 
struct ImportantExcerpt<'a> {
part: &'a str,
}
 
impl<'a> ImportantExcerpt<'a> {
fn announce_and_return(&self, announcement: &str) -> &str {
println!("Announcement: {}", announcement);
self.part
}
}
 
fn main() {
let s1 = String::from("long string");
let result;
{
let s2 = String::from("xy");
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
Lifetime 'a verbindet Eingabe-Lifetimes mit Ausgabe-Lifetime
2
struct ImportantExcerpt<'a>
Struct hält Referenz, Lifetime ist an Struct-Lifetime gebunden
3
fn announce_and_return(&self, announcement: &str) -> &str
Methoden-Lifetime an &self gebunden, nicht an den Parameter
4
result = longest(...)
Result wird verwendet, während s2 noch gültig ist, nicht nach s2 fällt