当我可以绑定(bind)可变变量时,为什么还需要重新绑定(bind)/隐藏?考虑:
let x = a();
let x = b(x);
对比
let mut x = a();
x = b(x);
可变变量绑定(bind)允许在 this 之上对该变量进行可变借用。 但是与可变绑定(bind)相比,阴影是否有一些优势?
最佳答案
因为两者的作用完全不同。
要真正了解发生了什么,我们需要从头开始:什么是绑定(bind)?绑定(bind)是什么意思?
让我们考虑一个简单的函数:fn hello() -> String;
。
像这样调用这个函数时:
fn main() {
hello();
}
会发生什么?
该函数返回一个 String
,它会被立即丢弃(执行 Drop
,因为它释放了内存)。
结果被删除是因为它没有绑定(bind)到变量名,语言规则说如果没有绑定(bind)则可以立即删除1。
但是,如果我们绑定(bind)这个结果,我们就会延长这个值的生命周期,并且我们可以通过这个绑定(bind)访问它……一段时间。
fn main() {
let value = hello();
std::mem::drop(value);
println!("{}", value); // Error: moved out of value
}
这是眼前的问题:在 Rust 中,值的生命周期独立于绑定(bind)的范围。
一个值甚至不需要在其绑定(bind)退出其范围之前被删除:它可以转移到另一个值(类似于从函数返回)。
fn main() {
let x;
{
let y = hello();
x = y;
}
println!("{}", x);
}
1 如果绑定(bind)到 _
也会发生同样的情况。
现在我们知道了绑定(bind)和值不同这一事实,让我们检查这两个片段。
第一个阴影片段,与你的不同:
fn main() {
let x = a();
let x = b();
}
步骤,按顺序:
- 表达式
a()
创建一个值,该值绑定(bind)到x
- 表达式
b()
创建一个值,该值绑定(bind)到x
b()
创建的值被丢弃a()
创建的值被丢弃
请注意,x
被重新绑定(bind)的事实不会影响先前绑定(bind)的值的生命周期。
从技术上讲,它的行为就像 b()
的结果绑定(bind)到 y
一样,唯一的异常(exception)是之前的 x
当 y
在范围内时绑定(bind)不可访问。
现在,可变片段:
fn main() {
let mut x = a();
x = b();
}
步骤,按顺序:
- 表达式
a()
创建一个值,该值绑定(bind)到x
- 表达式
b()
创建一个值,该值绑定(bind)到x
,以及先前的值(由a()
创建)被丢弃 b()
创建的值被丢弃
再一次,访问以前的值是不可能的,但是在使用阴影时暂时不可能(如果在较小的范围内进行阴影),使用赋值则永远不可能,因为值被删除了。
关于rust - 当我可以绑定(bind)可变变量时,为什么还需要重新绑定(bind)/隐藏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40621325/