首先,我不是在问&mut
和ref mut
本身有什么区别。
我问是因为我想:
let ref mut a = MyStruct
是相同的
let a = &mut MyStruct
考虑从函数返回一个特征对象。您可以返回 aBox<Trait>
或 a &Trait
。如果您想对其方法进行可变访问,是否可以返回&mut Trait
?
给定这个例子:
trait Hello {
fn hello(&mut self);
}
struct English;
struct Spanish;
impl Hello for English {
fn hello(&mut self) {
println!("Hello!");
}
}
impl Hello for Spanish {
fn hello(&mut self) {
println!("Hola!");
}
}
该方法接收一个可变引用用于演示目的。
这不会编译:
fn make_hello<'a>() -> &'a mut Hello {
&mut English
}
也不是这个:
fn make_hello<'a>() -> &'a mut Hello {
let b = &mut English;
b
}
但这将编译并工作:
fn make_hello<'a>() -> &'a mut Hello {
let ref mut b = English;
b
}
我的理论
此示例将使用不可变引用开箱即用(无需将其分配给变量,只需 return &English
)但不适用于可变引用。我认为这是由于规则只能有一个可变引用或尽可能多的不可变引用。
在不可变引用的情况下,您正在创建一个对象并将其作为返回表达式借用;它的引用不会因为它被借用而死。
在可变引用的情况下,如果您尝试创建一个对象并可变地借用它作为返回表达式,那么您有两个可变引用(创建的对象及其可变引用)。由于您不能对同一个对象有两个可变引用,因此它不会执行第二个,因此该变量不会存在足够长的时间。我认为当您编写let mut ref b = English
并返回时,b
您正在移动可变引用,因为它是由模式捕获的。
以上所有内容都是向自己解释它为什么有效的糟糕尝试,但我没有基础知识来证明它。
为什么会这样?