看起来阴影变量不会释放它所持有的借来的引用.以下代码无法编译:
fn main() {
let mut a = 40;
let r1 = &mut a;
let r1 = "shadowed";
let r2 = &mut a;
}
Run Code Online (Sandbox Code Playgroud)
带有错误消息:
error[E0499]: cannot borrow `a` as mutable more than once at a time
--> src/main.rs:5:19
|
3 | let r1 = &mut a;
| - first mutable borrow occurs here
4 | let r1 = "shadowed";
5 | let r2 = &mut a;
| ^ second mutable borrow occurs here
6 | }
| - first borrow ends here
Run Code Online (Sandbox Code Playgroud)
我希望代码能够编译,因为r1
在借用第二个引用之前,第一个引用被遮蔽了r2
.显然,第一次借用直到街区结束,尽管在第4行之后不再可以进入.为什么会这样?
TL; DR:Shadowing是关于名字查找,借用是关于生命周期.
从编译器的角度来看,变量没有名称:
fn main() {
let mut __0 = 40;
let __1 = &mut __0;
let __2 = "shadowed";
let __3 = &mut __0;
}
Run Code Online (Sandbox Code Playgroud)
这对于人类来说不是非常易读,因此该语言允许我们使用描述性名称.
阴影是重用名称的一种限制,对于"阴影"变量的词法范围,它将把名称解析为"阴影"(__2
这里)而不是"原始"(__1
这里).
然而,仅仅因为旧的不能再被访问并不意味着它不再存在:暗影!=分配.这在不同的范围内尤其值得注意:
fn main() {
let i = 3;
for i in 0..10 {
}
println!("{}", i);
}
Run Code Online (Sandbox Code Playgroud)
将始终打印3
:一旦阴影变量的范围结束,名称将再次解析为原始!