当我想知道可变引用如何进入方法时,所有的问题都开始了。
let a = &mut x;
a.somemethod(); // value of a should have moved
a.anothermethod(); // but it works.
我用谷歌搜索了很多。(真的很多)而且我注意到作为参数传递给函数的可变引用总是经历以下转换。(称为重借)
fn test(&mut a) -> ();
let a = &mut x;
test(a); // what we write in code.
test(&mut *a); // the actual action in code.
所以,我在谷歌上搜索了更多关于“再借”的细节。
这就是我所拥有的。
在任何代码中,x 指的是任意数据。我没有提到它,因为我认为它的类型对于讨论并不重要。(但是,我自己使用了 i32)。
let a = &mut x;
let b = &mut *a; // a isn't available from now on
*a = blahblah; // error! no more access allowed for a
*b = blahblah; // I've wrote this code not to confuse you of the lifetime of b. If not mentioned, it always live till the scope ends.
let a = &mut x;
{
let b = &*a;
// *a = blahblah in this scope will throw an error, just like above case.
}
*a = blahblah; // but this works.
好吧。这很有趣。看来b
不仅借x
,而且还借a
。
也许,我们可以像这样澄清再借:&'a *(&'b mut x)
。它已经借了x
(这里有一个生命周期'a),但也借了a
(它有一个生命周期'b)。
所以我运行了下面的代码来证实我的猜想。
let x: i32 = 1; // I wanted to make it clear that x lives in this scope.
let b;
{
let a = &mut x;
b = &mut *a;
}
*b = 0;
但这有效!
什么??但我只是决定得到这个。
&'a mut *&mutx
,不是&'a mut *&'b mutx
。
我不知道为什么mut x
在 的生命周期内不可用,&mut *&mutx
也不知道为什么在 的生命周期mut x
后重新可用&mut *&mutx
,但是“好吧,我们就这么说吧”。
但是看看这个。对于一个清晰和一般的理解,我完全没有想到。
let x: i32 = 1;
let b;
{
let a = &mut x;
let b = &**&a;
} // error!! a should live longer than b!
生命周期不是简单地依赖于真实数据b
所指的吗???
&'a **& &mut x
,不是&'a **&'b &'c mut x
。
现在呢?
&'a **&'b &mut x
???(这是我的猜测)。
我该如何接受这种复杂的情况?