我安裝了鏽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