let array = [40];
let mut var = 60;
for element in array.iter().filter(|&x| {*x < var}) {
var += 1; // Error
}
var += 1; // Fine again
對我來說這代碼似乎完全合法的,因爲封閉應由時間超過我實際訪問var
之外的它。瓶蓋保持局部變量的所有權長於預期
error[E0506]: cannot assign to `var` because it is borrowed
--> src/main.rs:6:9
|
5 | for element in array.iter().filter(|&x| {*x < var}) {
| ---- borrow of `var` occurs here
6 | var += 1; // Error
| ^^^^^^^^ assignment to borrowed `var` occurs here
爲什麼叫var += 1
時,即使關閉的範圍應該已經結束了被var
還是借來的?結果需要達到var += 1
。雖然可以在沒有filter
的情況下做這樣的事情,但這會導致我的代碼不太清晰,所以我想繼續使用它。
因此,如果我正確地解釋了一切,使用filter()將創建一個包含閉包(並借用val)的新結構,直到它超出範圍,這種情況一旦迭代器被調用並返回None,循環結束,過濾器結構超出範圍,意味着它停止借用val,我可以再次變異它。如果這是真的,我現在終於明白迭代器是如何工作的。謝謝,我的英文不好,我正在寫我的手機。 – SleepingPanda
@SleepingPanda是的。它創建一個['Filter'](https://doc.rust-lang。org/std/iter/struct.Filter.html)包含閉包的結構,閉包嘗試不斷地借用'var'。循環體試圖改變'var'。該結構的所有權被轉移到'for'循環中。 – Shepmaster