Rust 为什么我可以可变地从一个框中借用单独的字段,而不能借用其他引用类型?
通过一个简单的对象,我可以获得单个字段的可变引用:Rust 为什么我可以可变地从一个框中借用单独的字段,而不能借用其他引用类型?,rust,Rust,通过一个简单的对象,我可以获得单个字段的可变引用: struct MyObject { pub a: i32, pub b: i32, } fn func_1(obj: &mut MyObject) { let a = &mut obj.a; let b = &mut obj.b; *a += 1; *b *= 2; } 如果obj是MutexGuard或RefMut,则此功能不起作用: fn func_3(mtx:
struct MyObject {
pub a: i32,
pub b: i32,
}
fn func_1(obj: &mut MyObject) {
let a = &mut obj.a;
let b = &mut obj.b;
*a += 1;
*b *= 2;
}
如果obj
是MutexGuard
或RefMut
,则此功能不起作用:
fn func_3(mtx: &Mutex<MyObject>) {
let mut obj = mtx.lock().unwrap();
let a = &mut obj.a;
let b = &mut obj.b; // fails
...
}
fn func_4(rfc: &mut RefCell<MyObject>) {
let mut obj = rfc.borrow_mut();
let a = &mut obj.a;
let b = &mut obj.b; // fails
...
}
但是,如果obj
是一个框,则该不起作用:
fn func_2(obj: &mut Box<MyObject>) {
let a = &mut obj.a;
let b = &mut obj.b;
*a += 1;
*b *= 2;
}
fn函数2(对象:&mut框){
设a=&mut obj.a;
设b=&mut obj.b;
*a+=1;
*b*=2;
}
在电视上看到它
我的主要问题是为什么。为什么编译器知道这对Box
是可以的,而对其他的则不行?Box
特别吗?是的,这是Box
仍然特别的一种方式,尽管人们花费了大量的努力使其看起来像其他类型
RefMut
是在纯锈中实现的。您可以引用&mut obj.a等成员的原因是RefMut
实现了Deref
和DerefMut
,编译器使用DerefMut
获取&mut RefMut
Box
是唯一以这种特殊方式特殊的类型
有关框的特殊性的其他链接
因此,为了一致性起见,我是否应该避免使用此“功能”并将其视为正常的Deref
?@kmdreko如果您使用&mut*myDerefValue
从&mut impl Deref
中获取&mut T T
,则常规规则将再次适用。
fn func_2(obj: &mut Box<MyObject>) {
let a = &mut obj.a;
let b = &mut obj.b;
*a += 1;
*b *= 2;
}