Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Struct 是否可以通过引用返回结构的一部分?_Struct_Reference_Rust - Fatal编程技术网

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
中创建一个新对象并返回对它的引用时,您可能会玩一些恶心的把戏,但据我所知,所有这些都会导致内存泄漏。让我们忽略这些技术细节,只说这是完全不可能的

现在怎么办?您必须更改API
Vec
可以实现
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
    }
}