所以這裏有一些不同的事情發生在這裏。首先,這裏是答案:
fn main() {
let mut array = [1u8, 2u8, 3u8];
for value in &mut array {
*value = 0;
}
}
所以。你哪裏錯了?讓我們來看看什麼是value
,像這樣:
for &mut value in array {
let() = value;
}
這給出了這樣的錯誤:
= note: expected type `u8`
= note: found type `()`
所以在這裏,value
是u8
。但爲什麼?好吧,讓我們試試這個:
for value in array {
let() = value;
}
這給:
= note: expected type `&mut u8`
= note: found type `()`
所以,value
這裏是一個&mut u8
,參考到數組。所以說for &mut value
,我們說:「嘿,這將是一個可變的指針u8
。我們希望value
到是已指着u8
值,這是因爲&mut value
是模式,結合。針對&mut T
並結合value
到T
所以,我們刪除了&mut
,因爲我們不希望值的副本,我們想用它來修改什麼指着所以看起來像這樣:
fn main() {
let mut array = &mut [1u8, 2u8, 3u8];
for value in array {
*value = 0;
}
}
這個......編譯!我們完了嗎?好吧,讓我們嘗試打印出來array
,只是要確定:
fn main() {
let mut array = &mut [1u8, 2u8, 3u8];
for value in array {
*value = 0;
}
println!("{:?}", array);
}
這無法編譯:
error[E0382]: use of moved value: `array`
--> <anon>:7:22
|
3 | for value in array {
| ----- value moved here
我們通過遍歷破壞array
。爲什麼?那麼,當你像這樣循環訪問一個數組時,你說你想循環所有者。但這是而不是其實我們想要的;我們想通過可變引用來循環。
陣列有一個方法來幫助這個:
fn main() {
let mut array = &mut [1u8, 2u8, 3u8];
for value in array.iter_mut() {
*value = 0;
}
println!("{:?}", array);
}
iter_mut
將&mut T
而不是T
迭代。所以這個工作!
最後一兩件事,但:
let mut array = &mut [1u8, 2u8, 3u8];
這是說array
是&mut [u8; 3]
,那就是,一個可變引用數組,而不是數組本身。這可能不是你真正想要的,並且它不是我們的代碼所必需的。因此,我們可以刪除&mut
位:
let mut array = [1u8, 2u8, 3u8];
而現在你在我們的第一個代碼示例。
希望這會有所幫助!
這是一個*夢幻般的*答案。謝謝你的詳細解釋和所有的例子! – Cornstalks