![](/img/trans.png)
[英]Why does `Iterator.find()` require a mutable `self` reference?
[英]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.