- 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/
我有一个包含文件名 和文件路径 的元组列表。我想找到重复的 filename(但 filepath 可能不同),即文件名相同但 filepath 可能不同的元组。 元组列表示例: file_info
我有一个像这样定义的变量 auto drum = std::make_tuple ( std::make_tuple ( 0.3f , Ex
我有一个包含几个字段的自定义结构,我想在快速 switch 语句中对其进行模式匹配,这样我就可以通过将其中一个字段与另一个字段进行比较来自定义匹配正则表达式。 例如鉴于这种结构: struct MyS
我有一种动态元组结构: template //Should only be tuples class DynamicTuple { vector data; //All data is st
这个问题在这里已经有了答案: What and When to use Tuple? [duplicate] (5 个答案) 关闭 8 年前。 我正在查看 Tuple 的在线示例,但我没有看到任何理
在我的项目中我有很多坐标要处理,在二维情况下我发现(cons x y)的构造比(list x y)快和 (vector x y)。 但是,我不知道如何将 cons 扩展到 3D 或更进一步,因为我没有
我有以下 Scala 代码: def f(x: Int, y: Int): Option[String] = x*y match { case 0 => None case n =>
我的直觉告诉我,在一般情况下,只有宏或复杂类型的体操才能解决这个问题。 Shapeless 或 Scalaz 可以在这里帮助我吗?这是 N=2 问题的具体实例,但我正在寻找的解决方案适用于所有合理的
为什么这段 Scala 代码是这样的: class Test { def foo: (Int, String) = { (123, "123") } def bar: Unit
我是 python 和 pygame 的新手,我正在尝试学习向量和类的基础知识,但在这个过程中我搞砸了,而且我在理解和修复标题中的错误消息方面苦苦挣扎。 这是我的 Vector 类的代码: impor
我正在编写一个程序来打开和读取一个 txt 文件,并在每一行中循环。将第 2 列和第 4 列中的值相乘并将其分配给第 5 列。 A 500.00 A 84.15 ? B 648.80 B 77.61
我知道还有其他几个问题提出了完全相同的问题,但是当我运行时: 导入命令 从 pyDes 导入 * def encrypt(data, password,): k = des(password,
我有一个元组列表,内容如下: >>>myList [(), (), ('',), ('c', 'e'), ('ca', 'ea'), ('d',), ('do',), ('dog', 'ear', '
给定一个 boost::tuple 和 std::tuple,你如何在它们之间进行转换? 也就是说,您将如何实现以下两个功能? template boost::tuple asBoostTuple(
我无法初始化 std::tuple来自 std::tuple 的逐元素元素兼容类型。为什么它不像 boost::tuple 那样工作? #include #include template st
我是 Storm 的新手并且我正在尝试找出如何编写一个 bolt 测试来测试子类 BaseRichBolt 中的 execute(Tuple tuple) 方法。 问题是 Tuple 似乎是不可变的,
如果我有如下元组列表: [('a', 'b'), ('c', 'd'), ('a', 'b'), ('b', 'a')] 我想删除重复的元组(在内容和内部项目顺序方面重复)以便输出为: [('a',
我编写了一个简单的脚本来模拟基于每用户平均收入 (ARPU)、利润率和客户保持客户的年数 (ltvYears) 的客户生命周期值(value) (LTV)。下面是我的脚本。它在“ltvYears =
以下是我的代码,它是一组元组:。输出:设置([(‘A’,20160129,36.44),(‘A’,20160104,41.06),(‘A’,20160201,37.37)])。如何将另一个元组(‘A’
我用以下代码编写了一个程序: import pandas as pd import numpy as np from typing import Tuple def split_data(self,
我是一名优秀的程序员,十分优秀!