Ich versuche, Rust-Bindungen für eine C-Sammlung Bibliothek (Judy Arrays [1]) zu schreiben, die nur Platz bietet, um einen Zeigerbreite Wert zu speichern. Meine Firma hat eine Menge vorhandenen Code, der diesen Speicherplatz verwendet, um Nicht-Zeiger-Werte wie Zeiger-Breite-Ganzzahlen und kleine Strukturen direkt zu speichern. Ich möchte, dass meine Rust-Bindungen typsicheren Zugriff auf solche Sammlungen mit Generics erlauben, aber ich habe Probleme, die Pointer-Stashing-Semantik korrekt funktionieren zu lassen.Pointer-stashing Generics über `mem :: transmute()`
Die Funktion mem::transmute()
scheint wie ein potenzielles Werkzeug zur Implementierung des gewünschten Verhaltens zu sein, aber der Versuch, sie für eine Instanz eines parametrisierten Typs zu verwenden, führt zu einem verwirrenden Kompilierungsfehler.
Beispielcode:
pub struct Example<T> {
v: usize,
t: PhantomData<T>,
}
impl<T> Example<T> {
pub fn new() -> Example<T> {
Example { v: 0, t: PhantomData }
}
pub fn insert(&mut self, val: T) {
unsafe {
self.v = mem::transmute(val);
}
}
}
resultierende Fehler:
src/lib.rs:95:22: 95:36 error: cannot transmute to or from a type that contains type parameters in its interior [E0139]
src/lib.rs:95 self.v = mem::transmute(val);
^~~~~~~~~~~~~~
Ist dies eine Art bedeutet nur einen Parameter aus „enthalten Typparameter in seinem Innern“ und damit transmute()
einfach nicht funktionieren Hier? Irgendwelche Vorschläge für den richtigen Weg?
(Related question, versucht, das gleiche Ergebnis zu erzielen, aber nicht unbedingt über mem::transmute()
.)
[1] Ich bin mir dessen bewusst das bestehende rust-judy
Projekt, aber es unterstützt nicht die Zeiger-stashing Ich möchte und ich schreibe diese neuen Bindungen hauptsächlich als Lernübung.
Geändert nur zur ersten Frage; wird neu erstellen und für die Sekunde verknüpfen. – llasram
Eine interessante Frage! Es ist fast so, als ob Sie die Fähigkeit haben möchten, 'where sizeof (T) == sizeof (usize)' zu schreiben. – Shepmaster
@Shempmaster: Das wäre knifflig, weil die Verbindung zwischen der 'where'-Klausel und' transmute' etwas schwierig herzustellen wäre (besonders wenn allgemeinere Constraints verwendet werden können, wie bei '<=' and '> ='). Auf der anderen Seite erinnerte es mich an: [RFC: Coercible und HasPrefix für Zero Cost Conversions] (https://github.com/rust-lang/rfcs/issues/270); Die Bedingung könnte für einen Transmutable durchsetzbar sein, wobei mem :: size_of :: () == mem :: size_of :: () 'und dann' transmutieren 'von' T' in 'usize' würde' T erfordern: Transmutable '=> perfekt entscheidbar. –