capypad
0 Tage Serie
rust / expert
Snippet

Lifetime-Varianz und Kovarianz in Referenzen

Varianz bestimmt, wie das Subtyping zwischen Lifetimes die Kompatibilität komplexer Typen beeinflusst. Unveränderliche Referenzen sind kovariant über ihre Lifetime, was bedeutet, dass man eine längerlebige Referenz an eine Funktion übergeben kann, die eine kürzere erwartet. Veränderliche Referenzen sind hingegen invariant, um Speicherunsicherheit zu vermeiden.

snippet.rs
rust
1
2
3
4
5
6
7
8
fn subtyping_demo<'a, 'b: 'a>(short: &'a str, long: &'b str) {
// &'b str is a subtype of &'a str because 'b outlives 'a
let x: &'a str = long; // Covariance: we can use a longer lifetime where a shorter is expected
// This would fail if we used mutable references:
// let mut m_long: &'b str = "...";
// let r: &mut &'a str = &mut m_long; // Error: &mut T is invariant over T
}
Erklärung
1
'b: 'a
Eine Lifetime-Constraint, die besagt, dass 'b mindestens so lange wie 'a dauern muss.
2
let x: &'a str = long;
Demonstriert Kovarianz: Ein Subtyp (&'b) wird einem Supertyp (&'a) zugewiesen.
3
&mut T ist invariant
Stellt sicher, dass der exakte Typ T beibehalten wird, um ungültige Lifetime-Zuweisungen zu verhindern.