我不明白如何实现第三种与可变性交互的Deref胁迫:
从
&mut T到&U的T: Deref<Target=U>
它说 (重点地雷):
第三种情况更棘手:锈病也会胁迫不可变的参考。但相反的情况是不可能的:不可变的引用永远不会强制使用可变的引用。由于借用规则,如果您有可变引用,则该可变引用必须是对该数据的唯一引用(否则,程序将不会编译)。将一个可变引用转换为一个不可变引用的永远不会违反借用规则。将不变引用转换为可变引用的将要求初始不变引用是对该数据的唯一不可变引用,但借用规则不能保证这一点。因此,Rust不能假设将不可变引用转换为可变引用是可能的。
The 借入规则状态
在任何给定的时间,您可以有一个可变引用或任意数量的不可变引用。
当我们永远不能同时拥有一个可变的引用时,我们怎么能强迫一个可变的引用成为一个不变的引用?有例子吗?这和活性有关吗?
发布于 2021-08-04 14:29:51
这是其中一个微妙的,很容易失去时,试图写一个非正式的,可读的解释规则。我将尽力解释它,因为我理解它-但请注意,我不是专家确切的借用规则,我只是有一个工作模式,我已经向自己解释了我自己的方式。
“将可变引用转换为不可变引用”并不完全是这里要做的事情。相反,您是在借用(或“重借”)可变的引用。这与拥有的对象遵循相同的规则:
T &'a T**,,您都可以借用它来获得&'a T**,**,从使用&操作符开始,'a是一个生命周期。如果我们让类型变量T为&'b mut U ('b是可变引用开始的任何生命周期),那么我们替换它并获得
&'b mut U &'a &'b mut U**,,您都可以借用它来获得&'a &'b mut U**,**,从使用&操作符开始,'a是一个生命周期。(实际上,我们并不总是构建这个双重引用- the--这是您所要求的绕过它的规则--但我正在使用它作为一个工具来解释正在发生的事情。)
通常,当您借用一个拥有的T时,在借款结束之前,您不能直接修改T。同样的原则也适用于重借引用:如果你有一个&'b mut U,并且你借用它,你不能在借用结束之前改变这个&'b mut U。因此,对于不可变引用的生存期'a,不能使用可变引用来突变U。禁止可变混叠。
文本“在任何给定的时间,您可以有一个可变引用或任意数量的不可变引用。”应该理解为“…”对同一值的引用“- a引用与其引用的值不同。如果你写
let x = 1;
let b = &mut x;
let a = &b; // or &*b, or coercion — all produce the same lifetimes然后,x被b借用,所以只能通过b进行变异,而b则被a不可变地借用,所以在a被丢弃之前,b和x实际上都不能被用来突变任何东西。
我之所以说这是重借而非转换,是因为a的生命周期与b不同。
https://stackoverflow.com/questions/68644589
复制相似问题