![](/img/trans.png)
[英]Why does the Rust compiler complain that I use a moved value when I've replaced it with a new value?
[英]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);
請注意, v
和x
是單獨的變量綁定:只要變量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.