为什么阴影不会释放借来的参考?

kaz*_*ase 3 rust

看起来阴影变量不会释放它所持有的借来的引用.以下代码无法编译:

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行之后不再可以进入.为什么会这样?

Mat*_* M. 5

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:一旦阴影变量的范围结束,名称将再次解析为原始!