我安装了Rust 1.13并尝试了:
fn main() {
let x: u32;
x = 10; // no error?
}
当我编译此文件时会出现一些警告,但没有错误。由于我没有将x
声明为mut
,不应该x = 10;
导致错误吗?
答案 0 :(得分:15)
你所写的内容与:
相同let x: u32 = 10;
此后编译器不允许你改变它:
let x: u32;
x = 10;
x = 0; // Error: re-assignment of immutable variable `x`
请注意,如果您尝试使用未初始化的变量,则会出现编译错误:
let x: u32;
println!("{}", x); // Error: use of possibly uninitialized variable: `x`
如果要根据运行时条件以不同方式初始化变量,此功能非常有用。一个简单的例子:
let x: u32;
if condition {
x = 1;
} else if other_condition {
x = 10;
} else {
x = 100;
}
但如果可能没有初始化,那么仍然会出错:
let x: u32;
if condition {
x = 1;
} else if other_condition {
x = 10;
} // no else
println!("{:?}", x); // Error: use of possibly uninitialized variable: `x`
答案 1 :(得分:11)
如前所述,这不是变异,而是延迟初始化:
Rust编译器跟踪变量在编译时是否具有值,因此与C不同,不存在意外使用未初始化变量的风险(或者与C ++(从中移出的变量)不同。
使用延迟初始化的最重要原因是范围。
<canvas id="canvasMain" class="canvas" width="700" height="500"></canvas>
<canvas id="canvasBackground" class="canvas" width="700" height="500"></canvas>
在Rust中,借用检查器将验证引用不能超过它引用的值,从而防止悬空引用。
这意味着fn main() {
let x;
let mut v = vec!();
{
x = 2;
v.push(&x);
}
println!("{:?}", v);
}
要求v.push(&x)
的有效期超过x
,因此在 v
之前声明为。
对它的需求并不经常出现,但是当其他解决方案需要运行时检查时。