- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Rust 中编写一个 Vector 类只是为了好玩,我认为能够为它实现 Deref 会很好,就像访问元组引用一样访问它。例如,Vec2<f32>
可以取消引用为 &(f32, f32)
.我想到了这个:
pub struct Vec2<T> {
pub x: T,
pub y: T
}
impl<T> Deref for Vec2<T> {
type Target = (T, T);
fn deref(&self) -> &(T, T) {
&(self.x, self.y)
}
}
但是,由于编译器想要创建元组然后引用它,它会尝试移出结构。如果我使用 type Target = (&T, &T)
然后返回 &(&T, &T)
我必须使用明确的生命周期说明符,但我没有,因为我无法访问 self 生命周期。
现在我的问题是:有没有办法在不复制值的情况下做到这一点?由于我经常使用小型类型,因此我可能不会真正使用 Deref,但我想 DerefMut 可能会变得有用。
最佳答案
现在,没有办法做到这一点!至少在不使用 unsafe
的情况下不行! .
考虑返回类型 -> &Foo
.这意味着该函数返回对 Foo
的引用已经住在某个地方。特别是,如果你有 fn deref(&self) -> &Foo
这意味着 Foo
至少活到self
,因为生命周期省略开始并将其转换为 fn deref<'a>(&'a self) -> &'a Foo
.
现在,(T, T)
是一种类似于 Foo
的类型.所以fn deref(&self) -> &(T, T)
意味着您返回对 T
的元组的引用它已经住在某个地方。但是没有这样的元组!您可以在函数中创建一个元组,但这不会存在足够长的时间。同样,如果你说 -> &(&T, &T)
您说您返回了对已经存在于某处的元组(对 T
的引用)的引用。但同样:你没有一个已经存在于某处的元组。
所以特征 Deref
要求您返回对已经与 self
中的内容完全相同的内容的引用.所以有了这个,就不可能做你想做的事。
您可以使用不安全函数 mem::transmute()
.毕竟,像您这样的结构和元组应该具有完全相同的内存布局,对吧?
是也不是。两种内存布局可能是相同的,但 Rust 不保证! Rust 可以自由地重新排序字段和添加填充字节。虽然我怀疑结构、元组结构和元组的内存布局完全相同,但我找不到相关资料。因此,如果规范中没有这些信息,转换在技术上是不安全的。
在未来,HKT 或更确切地说是通用关联类型可以解决这个问题。也就是说,它们不会直接解决您的问题,而是使用 GAT,如 this RFC 中定义的那样。 ,可以重新定义 Deref
特征。即:
trait Deref {
type Target<'a>;
fn deref(&self) -> Self::Target<'a>;
}
现在我们被迫将生命周期放在“最外层”。有了这个,我们可以让类型实现 Deref
决定。在那种情况下你可以写:
impl<T> Deref for Vec2<T> {
type Target<'a> = (&'a T, &'a T);
fn deref(&self) -> Self::Target {
(&self.x, &self.y)
}
}
这样生命周期就“在里面”了。
但是 GAT 甚至还没有实现,所以还需要一些时间。此外,尚不清楚标准库何时/如何/是否以向后不兼容的方式更改,这将允许更改 Deref
.
关于rust - Deref struct to tuple 需要移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46081831/
我有一个数组 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
我是一名优秀的程序员,十分优秀!