考慮以下兩個結構:是否有可能通過引用返回結構的一部分?
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
}
哪裏BitStorage
實際上是被限制在所有無符號整數(U8,U16,U32,U64,USIZE)類型。
如何實施Deref
特質? (BitVector<S>
derefs到BitSlice<S>
類似於如何Vec<S>
derefs至&[S]
)
我曾嘗試以下(請注意,它不會由於與壽命問題的編譯,但更重要的是,因爲我嘗試在堆棧上返回值參考):
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
}
}
我知道可以通過引用返回一個結構的領域,因此,例如,我可以在Deref
性狀返回&Vec<S>
或&usize
,但有可能返回一個BitSlice
注意到我基本上擁有中的所有數據210已經作爲Vec<S>
可以轉換成&[S]
和storage_size
已經在那裏?
我會認爲這是可能的,如果我可以使用這兩個值創建一個結構,並以某種方式告訴編譯器忽略這一事實,即它是在堆棧上創建的結構,而不是使用現有的值,但我有不知道如何。
你的想法是正確的,即'storage_size'不是必需的,它只是'std :: mem :: size_of ::
()* 8',但是恐怕需要'capacity',因爲你可以分配位向量不是後備存儲的乘積,即。後備存儲是u32,你想分配50位,但是如果這樣做可以解除壓縮的作用,強制分配多個後備存儲器可能是合理的 – skiwi