lje*_*drz 8 enums rust borrow-checker
我希望能够获得对引用(包括可变和不可变)usize裹Bar在Foo枚举:
use Foo::*;
#[derive(Debug, PartialEq, Clone)]
pub enum Foo {
Bar(usize)
}
impl Foo {
/* this works */
fn get_bar_ref(&self) -> &usize {
match *self {
Bar(ref n) => &n
}
}
/* this doesn't */
fn get_bar_ref_mut(&mut self) -> &mut usize {
match *self {
Bar(ref mut n) => &mut n
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我无法获得可变参考,因为:
n活得不够久
我能提供的访问的其他内容类似的功能这两个变种Foo被Box艾德-为何可变借(为什么只有它)失败,未装箱原始?
您需要更换Bar(ref mut n) => &mut n有Bar(ref mut n) => n.
当您使用ref mut nin时Bar(ref mut n),它会创建对数据的可变引用Bar,因此类型n为&mut usize.然后,你试图返回&mut n的&mut &mut u32类型.
这部分很可能是不正确的.
现在deref强制开始并转换
&mut n成&mut *n,创建一个*n类型的临时值usize,这个值不够长.
这些示例显示了示例问题:
fn implicit_reborrow<T>(x: &mut T) -> &mut T {
x
}
fn explicit_reborrow<T>(x: &mut T) -> &mut T {
&mut *x
}
fn implicit_reborrow_bad<T>(x: &mut T) -> &mut T {
&mut x
}
fn explicit_reborrow_bad<T>(x: &mut T) -> &mut T {
&mut **&mut x
}
Run Code Online (Sandbox Code Playgroud)
这些explicit_版本显示了编译器通过deref强制推断的内容.
该_bad版本既错误完全相同的方式,而其他两个编译.
这可能是一个错误,也可能是对编译器当前如何实现生命周期的限制.&mut Tover 的不变性T 可能与它有关,因为它导致在推理期间&mut &'a mut T不变'a,因此比共享reference()情况更具限制性&&'a T,即使在这种情况下严格性是不必要的.
| 归档时间: |
|
| 查看次数: |
559 次 |
| 最近记录: |