- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
struct MyCell<T> {
value: T
}
impl<T> MyCell<T> {
fn new(value: T) -> Self {
MyCell { value }
}
fn get(&self) -> &T {
&self.value
}
fn set(&self, new_value: T) {
unsafe {
*(&self.value as *const T as *mut T) = new_value;
}
}
}
fn set_to_local(cell: &MyCell<&i32>) {
let local = 100;
cell.set(&local);
}
fn main() {
let cell = MyCell::new(&10);
set_to_local(&cell);
}
调用cell.set(&local)
时,假设 cell
是'x
和 '&local
是'y
, 我被告知协方差规则将改变 cell
的类型来自 &MyCell<'x, &i32>
至 &MyCell<'y, &i32>
.
不安全 block 内的赋值如何影响 set()
参数的生命周期推断? ?原始指针没有生命周期那么编译器怎么知道它应该 cell
和 new_value
使用协方差具有相同的生命周期?
最佳答案
How does the assignment inside the unsafe block affect the lifetime inference for the parameters of
set()
?
它不是——而且这甚至不特定于原始指针或 unsafe
.函数体从不影响函数签名的任何方面(此处不相关的 async fn
除外)。
Raw pointers does not have lifetime then how does the compiler know it should make
cell
andnew_value
have the same lifetime using covariance?
听起来您误读了一些建议。在您的代码中,Cell<T>
在 T
中不变,但是对于一个内部可变类型来说,它必须在类型参数中是不变的(不是协变的)。在您的代码中,编译器推断 T
的协方差因为MyCell
包含一个简单类型为 T
的字段.协变是大多数泛型类型的“典型”情况。
因此,您的代码是不健全的因为MyCell
在 T
上是协变的但必须在 T
上保持不变.
您的代码也不可靠,因为在 set()
的实现中,您正在创建对 T
的不可变引用, &self.value
,然后写给它的指称。这是“未定义的行为”不管你怎么做,因为创建&self.value
向编译器/优化器断言指向的内存在引用被删除之前不会被修改。
如果你想重新实现标准库的Cell
,你必须像标准库那样做,使用 UnsafeCell
原始的:
pub struct Cell<T: ?Sized> {
value: UnsafeCell<T>,
}
UnsafeCell
是您选择退出 &
的方式的不变性保证:创建一个 &UnsafeCell<T>
不断言 T
不会变异。它在 T
中也是不变的, 这会自动使 T
中的包含类型不变.这两者在这里都是必需的。
关于rust - 当涉及原始指针时,Rust 如何推断生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71261078/
我正在开发一个使用多个 turtle 的滚动游戏。玩家 turtle 根据按键命令在 Y 轴上移动。当危害和好处在 X 轴上移动时,然后循环并改变 Y 轴位置。我尝试定义一个名为 colliding(
我不明白为什么他们不接受这个作为解决方案,他们说这是一个错误的答案:- #include int main(void) { int val=0; printf("Input:- \n
我正在使用基于表单的身份验证。 我有一个注销链接,如下所示: 以及对应的注销方法: public String logout() { FacesContext.getCurren
在 IIS7 应用程序池中有一个设置 Idle-time out 默认是 20 分钟,其中说: Amount of time(in minutes) a worker process will rem
我是一名优秀的程序员,十分优秀!