- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下两个结构:
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>
取消引用 BitSlice<S>
类似于 Vec<S>
取消引用 &[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
}
}
我知道可以通过引用返回结构的字段,例如我可以返回 &Vec<S>
或 &usize
在Deref
特征,但是否有可能返回 BitSlice
注意我基本上拥有 BitVector
中的所有数据已经是Vec<S>
可以转化为&[S]
和 storage_size
已经在那里了吗?
如果我可以使用这两个值创建一个结构并以某种方式告诉编译器忽略它是在堆栈上创建的结构这一事实而只是使用现有值,我认为这是可能的,但我有不知道怎么做。
最佳答案
Deref
需要返回一个引用。引用总是 指向一些现有的内存,任何局部变量都不会存在足够长的时间。虽然从理论上讲,您可以玩一些变态的把戏来在 deref
中创建一个新对象。并返回对它的引用,我所知道的所有这些都会导致内存泄漏。让我们忽略这些技术细节,直接说这是不可能的。
现在呢?你必须改变你的 API。 Vec
可以实现Deref
因为它引用了 [T]
,而不是&[T]
或类似的东西。您可能会使用相同的策略获得成功:Make BitSlice<S>
一个未调整大小的类型,只包含一个切片 [S]
, 所以返回类型是 &'a BitSlice<S>
.这假设 storage_size
不需要成员。但这似乎指的是逻辑上有效的位数(即可以在不扩展位向量的情况下访问)——如果是这样,那似乎是不可避免的1。
当然,另一种选择是不实现 Deref
.不方便,但如果您的切片数据类型与实际切片相距太远,它可能是唯一的选择。
RFC PR #1524建议自定义动态大小的类型,那么你可以有一个类型 BitSlice<S>
这就像一个切片,但可以包含其他内容,例如 storage_size
.然而,这还不存在,而且它是否会存在还远未确定。
1 capacity
成员(member) BitVector
然而,似乎毫无意义。不就是sizeof S * 8
吗? ?
关于struct - 是否可以通过引用返回结构的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37799454/
我有一个数组 items[] items[] 中的每一项都是一个结构体。 item 有键 id、date、value(即 item.id、item.date、item.value) 我想使用 Stru
我想存储 100 名员工。 RollNo,姓名,工资,时间(各种数据,我无法在这里解释,但你可以看下面的代码片段来理解 main() { struct day { int hour
这个问题在这里已经有了答案: storage size of ‘names’ isn’t known (3 个答案) 关闭 5 年前。 我正在尝试蓝牙编程,遇到了这个我不明白的问题。基本上,当我使用
这是一个奇怪的事情: 我有一个结构,它包含指向相同类型结构的指针和指向其他类型结构的指针,以及一些其他值。 struct animal { struct animal * father;
我有一个结构定义如下(名称不同) struct str1 { int field1; struct str2; } 我在一个函数中有一个*str1。我想要一个指向 str2 的指针。 所以
DISK_DETECTION_INFO is defined as有什么原因吗? typedef struct _DISK_DETECTION_INFO { DWORD Size
我正在尝试打包一个字符串和一个字符串的长度。 fmt = '
我在创建结构时遇到问题。 我的结构: public struct Device: Codable { let data: DeviceData let meta: Meta? } pu
struct Item { var name:String? var type:String? var value:Int? var tag:Int? } ... ..
// NewReaderSize returns a new Reader whose buffer has at least the specified 43 // size. If the ar
这个问题在这里已经有了答案: Sorting a vector of custom objects (14 个答案) 关闭 3 年前。 在下面的 C++ 片段中, 如何基于 TwoInts 结构中的
#include struct Header { unsigned long long int alignment; }; int main(void) { struct Heade
我有一个目前看起来像这样的结构(缩写为仅显示基本部分): typedef struct { uint32_t baudrate; ... some other internally u
对此没有太多解释,这就是我所拥有的: public struct PACKET_HEADER { public string computerIp; publi
我有以下代码: struct MyStruct{ data: &'a str, } fn get(S: &'a MyStruct) -> &'a str{ S.data } fn se
struct S1 { char c; int i; }; struct S3 { char c1; struct S1 s; double c2; }; 我正
我有一个名为 Parameter 的协议(protocol): protocol Parameter { var name: String { get } var unit: Unit
有 2 个 struct 定义 A 和 A。我知道 struct A 可以包含指向 struct A 的 POINTER 但我不明白为什么 struct A 不能包含struct A(不是指针) 最佳
我有以下代码: struct MyStruct{ data: &'a str, } fn get(S: &'a MyStruct) -> &'a str{ S.data } fn se
为了说明这一点,这里有一个小的不可变结构和一个更新它的函数: (struct timeseries (variable observations) #:transparent) (define (ad
我是一名优秀的程序员,十分优秀!