rust / expert
Snippet
Erzwingen von Lebensdauer-Invarianz mittels PhantomData
Standardmäßig sind Referenzen und Typen, die Lebensdauern parametrisieren, kovariant. Typen, die Mutationen erlauben (wie veränderliche Referenzen oder Cells), müssen jedoch über ihre Typparameter und Lebensdauern invariant sein, um unsicheres Teilen von Referenzen zu verhindern. Die Verwendung von PhantomData<fn(&'a T) -> &'a T> erzwingt Lebensdauer-Invarianz für die generische Lebensdauer 'a.
snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
use std::marker::PhantomData;struct CellRef<'a, T> {value: *mut T,_marker: PhantomData<fn(&'a T) -> &'a T>,}impl<'a, T> CellRef<'a, T> {fn new(val: &'a mut T) -> Self {CellRef { value: val as *mut T, _marker: PhantomData }}}
Erklärung
1
_marker: PhantomData<fn(&'a T) -> &'a T>
Verwendet eine Funktionssignatur in PhantomData, um die Lebensdauer 'a invariant zu machen, da der Parameter sowohl in kovarianten als auch in kontravarianten Positionen erscheint.
2
value: *mut T
Ein roher, veränderlicher Zeiger, dem Lebensdauer-Einschränkungen fehlen, was die manuelle Anwendung von PhantomData erfordert, um die Lebensdauer zu binden.