eine Struktur gegeben, die einen Zeiger Wraps,Wie deklariere ich einen generischen Typ, der ein roher Zeiger ist?
pub struct Ptr<T> {
ptr: T
}
Ist es möglich, zu erklären, dass T
ein Rohzeiger Typ sein muss? zB *mut SomeStruct
oder *const SomeStruct
.
Ohne dies kann ich Operationen wie &*self.ptr
innerhalb einer Methode nicht ausführen, da Rust nicht ptr
wie ein Zeiger behandelt werden kann.
Beachten Sie, dass dies gemacht werden kann, arbeiten:
pub struct Ptr<T> {
ptr: *mut T
}
Aber in diesem Fall ist es schwer Codes *mut
, wo wir *const
in anderen Fällen wollen könnten.
Siehe: this answer um etwas Kontext zu geben.
Rohe Zeiger verwenden nicht 'ops :: Deref'. Es scheint, dass die Fähigkeit, einen Zeiger unsicher zu entfernen, irgendwie compilerintern ist. Es ist also nicht möglich, dieses unsichere Unwrap-Verhalten in einem generischen Kontext zu erhalten. Sie könnten ein benutzerdefiniertes Merkmal schreiben und eine eigene Methode zum Entfernen verwenden, anstatt den Operator zu verwenden ... –
Ich denke, 'ptr' als Zeiger zu deklarieren ist der richtige Weg. Sie können immer zwischen '* const T' und' * mut T' mit 'as' konvertieren. Und wenn Sie wirklich eine Unterscheidung wollen, können Sie eine Enum mit zwei Varianten oder eine Eigenschaft mit zwei Strukturen, die es implementieren. –