为什么编译器在未声明为变量的变量被修改时报告错误?

时间:2017-04-20 12:37:24

标签: variables syntax compilation rust mutable

我安装了Rust 1.13并尝试了:

fn main() {
    let x: u32;
    x = 10; // no error?
}

当我编译此文件时会出现一些警告,但没有错误。由于我没有将x声明为mut,不应该x = 10;导致错误吗?

2 个答案:

答案 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之前声明为

对它的需求并不经常出现,但是当其他解决方案需要运行时检查时。