- 注意像println!(xxxx)这样的代码会夺走所有权,并且对其进行释放,接下来就是要注意下面的代码,这种代码中如果在大的作用域中使用定义,然后在小的作用域中仅仅对其进行初始化,之后在大的作用域中仍然可以输出。
fn main() {
// 声明一个变量绑定
let a_binding;
{
let x = 2;
// 初始化一个绑定
a_binding = x * x;
}
println!("a binding: {}", a_binding);
let another_binding;
// 报错!使用了未初始化的绑定
//println!("another binding: {}", another_binding);
// 改正 ^ 注释掉此行
another_binding = 1;
println!("another binding: {}", another_binding);
}
冻结:当数据被相同的名称不变地绑定时,它还会冻结(freeze)。在不可变绑定超出作用域之前,无法修改已冻结的数据:
fn main() {
let mut _mutable_integer = 7i32;
{
// 被不可变的 `_mutable_integer` 遮蔽
let _mutable_integer = _mutable_integer;
// 报错!`_mutable_integer` 在本作用域被冻结
_mutable_integer = 50;
// 改正 ^ 注释掉上面这行
// `_mutable_integer` 离开作用域
}
// 正常运行! `_mutable_integer` 在这个作用域没有冻结
_mutable_integer = 3;
}