Betrachten Sie die folgenden zwei Strukturen:Ist es möglich, einen Teil einer Struktur als Referenz zurückzugeben?
pub struct BitVector<S: BitStorage> {
data: Vec<S>,
capacity: usize,
storage_size: usize
}
pub struct BitSlice<'a, S: BitStorage> {
data: &'a [S],
storage_size: usize
}
Wo BitStorage
ist praktisch eine Art, die für alle unsignierten ganzen Zahlen beschränkt ist (U8, U16, U32, U64, USIZE).
Wie implementiert man die Deref
Eigenschaft? (BitVector<S>
derefs zu BitSlice<S>
ähnlich, wie Vec<S>
derefs zu &[S]
)
Ich habe versucht, die folgenden (Beachten Sie, dass es nicht aufgrund von Problemen mit Lebensdauern nicht kompiliert, aber noch wichtiger ist, weil ich versuche, einen Wert auf dem Stack zurückzukehren, wie eine Referenz):
impl<'b, S: BitStorage> Deref for BitVector<S> {
type Target = BitSlice<'b, S>;
fn deref<'a>(&'a self) -> &'a BitSlice<'b, S> {
let slice = BitSlice {
data: self.data,
storage_size: self.storage_size,
};
&slice
}
}
ich weiß, dass es möglich ist, ein Feld einer Struktur unter Bezugnahme auf zurückkehren, so zum Beispiel ich &Vec<S>
oder &usize
im Deref
Zuge zurückkehren könnte, aber ist es möglich, ein BitSlice
zurück Beachten Sie, dass ich im Wesentlichen alle Daten in derhaben 210 schon als Vec<S>
kann in &[S]
umgewandelt werden und ist schon da?
Ich denke, das ist möglich, wenn ich eine Struktur mit beiden Werten erstellen könnte und den Compiler irgendwie anweisen, die Tatsache zu ignorieren, dass es eine Struktur ist, die auf dem Stapel erstellt wird und stattdessen nur die vorhandenen Werte verwendet, aber ich habe habe keine Ahnung wie.
Sie sind richtig in Ihrer Annahme, dass 'storage_size' nicht benötigt wird, es ist nur' std :: mem :: size_of ::
() * 8', aber ich habe Angst, dass 'Kapazität' benötigt wird, wie Sie zuordnen könnten ein Bitvektor, der kein Mehrfaches des Hintergrundspeichers ist, d.h. Sicherungsspeicher ist u32 und Sie möchten 50 Bits zuweisen, obwohl es sinnvoll sein könnte, die Zuweisung in Vielfachen des Sicherungsspeichers zu erzwingen, wenn dies das Funktionieren des Derefing ermöglicht – skiwi