簡體   English   中英

為什么for循環不需要可變迭代器?

[英]Why does a for loop not require a mutable iterator?

如果我想手動使用迭代器,它必須是可變的:

let test = vec![1, 2, 3];
let mut test_mut = test.iter();
while let Some(val) = test_mut.next() {
    println!("{:?}", val);
}

但我可以愉快地使用for循環來使用它,即使它是不可變的。

let test = vec![1, 2, 3];
let test_imm = test.iter();
for val in test_imm {
    println!("{:?}", val);
}

認為這是有效的,因為test_imm被移動到for循環的塊中,因此外部塊不能再使用test_imm ,並且(從外部塊的角度來看)不可變直到for循環,然后它是無法訪問,所以沒關系。

那正確嗎? 還有更多要解釋的嗎?

這是完全正確的。 因為它被移動到for循環,所以for循環現在擁有它並且可以隨心所欲地做任何事情,包括“使它”變得可變。 考慮這個類似的例子,我們似乎在改變xs盡管它是不可變的,但實際上是因為我們正在移動它,所以新的所有者可以隨意使用它,包括將其重新綁定為可變:

let xs: Vec<i32> = vec![1, 2, 3];

fn append(v: Vec<i32>, x: i32) -> Vec<i32> {
    let mut my_v = v;
    my_v.push(x);
    my_v
}

let appended = append(xs, 4);

操場

請注意,使用mut參數便捷語法可以縮短函數:

fn append(mut v: Vec<i32>, x: i32) -> Vec<i32> {
    v.push(x);
    v
}

iter模塊的文檔中或多或少地解釋這一點。

暫無
暫無

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

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