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



我安装了生锈1.13并尝试了:

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

当我编译此文件时,有一些警告,但是没有错误。由于我没有将x宣布为mut,因此x = 10;是否应该引起错误?

您所写的内容与:

相同
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`

如前所述,这不是突变,而是递延初始化:

  • 突变是关于更改现有变量的价值,
  • 递延初始化是关于在一个点上声明变量,然后稍后初始化。

RUST编译器跟踪变量是否在编译时值有值,因此与C不同的是使用非初始化变量(或与C 不同(无意中的风险,该变量是从转移到的变量(。


使用延期初始化的最重要原因是范围

fn main() {
    let x;
    let mut v = vec!();
    {
        x = 2;
        v.push(&x);
    }
    println!("{:?}", v);
}

在Rust中,借贷 - 检查器将证明参考无法超过其所指的价值,以防止参考。

这意味着v.push(&x)要求x的寿命比v更长,因此在 v之前声明

需要经常出现它,但是当它执行其他解决方案时,需要运行时间检查。

最新更新