首先,我不是在问&mut
和ref mut
之间有什么区别.
我这么问是因为我想:
let ref mut a = MyStruct
和
let a = &mut MyStruct
考虑从一个函数返回一个特征对象.你可以退Box<Trait>
或&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
}
My theory
本例将使用不可变引用(不必将其分配给变量,只需返回&English
),但不使用可变引用.我认为这是由于一条规则,即只能有一个可变引用,或者可以有任意多个不可变引用.
在不可变引用的情况下,创建一个对象并将其作为返回表达式borrow ;它的引用不会因为被borrow 而消亡.
在可变引用的情况下,如果试图创建一个对象,并将其作为返回表达式可变地borrow ,则有两个可变引用(创建的对象及其可变引用).因为不能对同一个对象有两个可变引用,所以它不会执行第二个引用,因此变量的生命周期 不够长.我认为当你写let mut ref b = English
并返回b
时,你就是可变引用,因为它被一个模式捕获了.
所有这些都是对自己解释它为什么有效的拙劣try ,但我没有基本原理来证明它.
为什么会这样?