2017-04-20 28 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之前因此被宣佈

對它的需求不會經常出現,但是當其他解決方案需要運行時檢查時。

相關問題