考虑以下两个结构:是否有可能通过引用返回结构的一部分?
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