在任何语言中这应该是一个微不足道的任务。但在Rust中却无法正常工作。
use std::collections::HashMap;
fn do_it(map: &mut HashMap<String, String>) {
for (key, value) in map {
println!("{} / {}", key, value);
map.remove(key);
}
}
fn main() {}
这是编译器的错误:
error[E0382]: use of moved value: `*map`
--> src/main.rs:6:9
|
4 | for (key, value) in map {
| --- value moved here
5 | println!("{} / {}", key, value);
6 | map.remove(key);
| ^^^ value used here after move
|
= note: move occurs because `map` has type `&mut std::collections::HashMap<std::string::String, std::string::String>`, which does not implement the `Copy` trait
为什么它要移动一个引用?根据文档,我认为移动/借用不适用于引用。
for (key, value) in map {}; for (key, value) in map {}
获得相同的错误,而且我认为这个答案没有解释清楚。 - Josh Leemap.clear()
会发生什么?key
和value
是引用,它们将不再引用任何东西。从借用检查的角度来看,clear
和remove
都使用&mut self
,它们是相同的。 - loganfsmyth