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
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