簡體   English   中英

為什么編譯器不抱怨迭代器移動到for循環是不可變的?

[英]Why does the compiler not complain that an iterator moved to a for loop is immutable?

我正在閱讀Rust Book的第二版,我在迭代器部分找到了以下示例:

let v1 = vec![1, 2, 3];
let v1_iter = v1.iter();    
for val in v1_iter {
    println!("Got: {}", val);
}

為什么編譯器不抱怨v1_iter是不可變的? 該書說for循環取得了v1_iter所有權,並使其在幕后變得可變,但是你可以將一個不可變變量轉換為可變嗎?

該書說for循環取得了v1_iter的所有權,並使其在幕后變得可變,

確切地說,人們可以做一個更簡單的例子:

let v = vec![1,2,3];
let mut x = v;
x.push(0);

請注意, vx是單獨的變量綁定:只要變量v保留了我們的3元素向量,變量的約定就是向量不會被變異。 但是,向量被移動到x ,這表明可變性是可接受的。 這同樣適用於函數調用:

fn foo(mut x: Vec<i32>) {
    x.push(0);
}

let v = vec![1,2,3];
foo(v);

這是安全的,因為只有一個變量在其生命周期的任何一點擁有向量。 v移動到x ,將無法再使用v 同樣,在您的代碼中,在for循環之后不能再使用v1_iter

但是你可以將不可變變量轉換為可變嗎?

兩個片段都有效,因為該值已移至聲明為mut的新變量。 但是,一旦變量被聲明為不可變(或可變),該變量在其所有生命周期內都保持不變,並且無法更改。 所以答案是否定的,但所有權語義允許在具有不同可變性保證的變量之間移動值。

也可以看看:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM