此函數不會編譯,因爲它試圖返回v0
,它已被移至指定爲v1
的位置。我明白那個。指定給移動的變量似乎「否定」移動
fn testvec() -> Vec<i64> {
let mut v0 = vec![0,1,2];
let v1 = v0;
//v0 = vec![1,2,3];
v0
}
但是,如果我取消v0
作業的註釋,它將進行編譯。這背後的原則是什麼?有記錄嗎?
當我第一次發現這種行爲時,函數看起來像這樣。它的行爲與上述相同,但我也懷疑嵌套塊是否有所作爲。
fn testvec() -> Vec<i64> {
let mut v0 = vec![0,1,2];
{
let v1 = v0;
//v0 = vec![1,2,3];
}
v0
}
UPDATE
總結我的困惑:我想到了一個「移動」實際上是由變量名訪問。但實際上只有變量的內容變得不可訪問。例如。這個編譯器錯誤是誤導性的:v0 moved here because
- 它聽起來像變量名稱被移動,而不僅僅是它的值。
* pocket flamebrower * =>我在哪裏可以找到一個? –
@MatthieuM:對不起,這是受限制的信息。 –
我應該如何考慮「移動」作爲*內容*被移動,而不是「變量(標籤)不再可訪問」?是否這樣做使'v0'未定義 - 即編譯器正在保護我訪問一個未定義的變量?編譯器錯誤消息有點令人困惑。例如。 '使用移動值:v0'應該說「使用從v0移出的值」。 'v0移動到這裏是因爲...'應該是'* v0的內容*移到這裏了......「(強調增加了)。 'v0'不是被移動的東西。我的理解是否正確? – Kelvin