これはどの言語でも簡単な作業です。これはRustでは機能しません。参照を移動しようとしているのはなぜハッシュマップを反復処理して、キー/値を表示し、Rustの値を削除する方法は?
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
:
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() {}
ここでコンパイラエラーですか?ドキュメンテーションから、私は移動/借用が参照に適用されたとは思わなかった。
私はmap()の 'for(key、value);で同じエラーを得ることができます。 for(key、value)for map {} '、と私はこの答えがそれを説明するとは思わない。 –
これについて考えてみると、 'map.clear()'をループ内で呼び出すとどうなりますか? 'key'と' value'は参照であり、もう何も参照しません。 'clear'と' remove'はどちらも '&mut self'を使用し、borrow-checkerの観点からは同じです。 – loganfsmyth
これは私にはさらに厄介な問題をもたらしましたが、メソッド呼び出しの構文が問題を不明瞭にしていると思われます。 https://play.rust-lang.org/?gist=ecf6d9bdbe8e1ad99e5fb3c35c402d1c&version=stable –