Struct 是否可以通过引用返回结构的一部分?
考虑以下两种结构:Struct 是否可以通过引用返回结构的一部分?,struct,reference,rust,Struct,Reference,Rust,考虑以下两种结构: 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 } 我知道可以通过引用返回结构的字段,因此,例如,我可以在
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
}
我知道可以通过引用返回结构的字段,因此,例如,我可以在Deref
特性中返回&Vec
或&usize
,但是是否可以返回一个位片
,注意我基本上已经拥有位向量
中的所有数据,因为向量
可以转换为和[S]
,并且存储大小
已经存在
如果我可以使用这两个值创建一个结构,并告诉编译器忽略它是在堆栈上创建的结构这一事实,而只使用现有的值,我认为这是可能的,但我不知道如何使用。返回引用需要Deref。引用总是指向一些现有内存,任何局部变量都不会存在足够长的时间。理论上,在
deref
中创建一个新对象并返回对它的引用时,您可能会玩一些恶心的把戏,但据我所知,所有这些都会导致内存泄漏。让我们忽略这些技术细节,只说这是完全不可能的
现在怎么办?您必须更改APIVec
可以实现Deref
,因为它对[T]
,而不是对&[T]
或诸如此类的东西进行排序。您可以使用相同的策略获得成功:使位片
成为只包含一个片的无大小类型[S]
,这样返回类型就是&位片
。这假设不需要存储大小成员。但这似乎是指逻辑上有效的位数(即,可以在不扩展位向量的情况下访问)——如果是这样,这似乎是不可避免的1
当然,另一种选择是不实现Deref
。不方便,但如果切片数据类型与实际切片距离太远,则它可能是唯一的选项
如果建议自定义动态大小的类型,那么您可以有一个类似于片的类型位片
,但可以有额外的内容,例如存储大小
。然而,这还不存在,而且还远不能确定它是否会存在
1然而,位向量
上的容量
成员似乎毫无意义。这不正是S*8的大小吗?你的假设是正确的,即不需要存储大小,只是std::mem::size of::()*8
,但是我担心需要容量,因为你可以分配一个不是备份存储的倍数的位向量,也就是说,备份存储是u32,您希望分配50位,但如果这使解除引用能够工作,则强制以备份存储的倍数进行分配可能是合理的
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
}
}