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;
}