2017-04-20 63 views

回答

12

你所写的内容是相同的:

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` 
+4

习惯性生锈更可能在这里使用面向表达式的语法:'let x = if condition {1} else else other_condition {10} else {100};'。这些示例中不需要延迟初始化。 –

+1

@MatthieuM。确实如此。但是如果某些条件分支内有不同的副作用,那看起来很奇怪。在这种情况下,我认为这种形式会更习惯。 –

8

如前所述,这是不是突变,而是推迟初始化:

  • 突变是要改变现有的变量的值,
  • 推迟initi alization是关于在一个点声明一个变量,并在稍后初始化它。

锈病编译磁道的变量是否具有在编译时的值,所以与C没有意外地使用一个未初始化的变量(或不同于C++,这是从移动的变量)的风险。


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

fn main() { 
    let x; 
    let mut v = vec!(); 

    { 
     x = 2; 
     v.push(&x); 
    } 

    println!("{:?}", v); 
} 

在Rust中,借用检查器将验证引用不能超过它引用的值,从而防止悬挂引用。

这意味着v.push(&x)要求x的生活比v长,v之前因此被宣布

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

相关问题