我安装了锈1.13和尝试:为什么编译器在未声明为mutable的变量被修改时报告错误?
fn main() {
let x: u32;
x = 10; // no error?
}
当我编译这个文件有一些警告,但没有错误。由于我没有声明x
为mut
,应该不是会导致错误?
我安装了锈1.13和尝试:为什么编译器在未声明为mutable的变量被修改时报告错误?
fn main() {
let x: u32;
x = 10; // no error?
}
当我编译这个文件有一些警告,但没有错误。由于我没有声明x
为mut
,应该不是会导致错误?
你所写的内容是相同的:
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`
此功能可以是非常有用的,如果你想ini根据运行时条件对变量进行不同的分级。一个天真的例子:
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`
习惯性生锈更可能在这里使用面向表达式的语法:'let x = if condition {1} else else other_condition {10} else {100};'。这些示例中不需要延迟初始化。 –
@MatthieuM。确实如此。但是如果某些条件分支内有不同的副作用,那看起来很奇怪。在这种情况下,我认为这种形式会更习惯。 –
如前所述,这是不是突变,而是推迟初始化:
锈病编译磁道的变量是否具有在编译时的值,所以与C没有意外地使用一个未初始化的变量(或不同于C++,这是从移动的变量)的风险。
使用延迟初始化最重要的原因是范围。
fn main() {
let x;
let mut v = vec!();
{
x = 2;
v.push(&x);
}
println!("{:?}", v);
}
在Rust中,借用检查器将验证引用不能超过它引用的值,从而防止悬挂引用。
这意味着v.push(&x)
要求x
的生活比v
长,v
之前因此被宣布。
对它的需求不会经常出现,但是当其他解决方案需要运行时检查时。
这是推迟的初始化,而不是突变。 – ildjarn
Rust 1.16是Rust的最新版本,1.17应该在几周内发布。值得保持现状。 – Shepmaster