我安装了生锈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
之前声明。
需要经常出现它,但是当它执行其他解决方案时,需要运行时间检查。