2016-08-27 2 views
0

私は、単語の出現頻度を計算するプログラムを作成しています。これは私のコードの一部です。「一度に複数回変更可能なものを借りることはできません」if-else

// hm is a HashMap<&str, u32> 
if let Some(val) = hm.get_mut(tt) { 
    *val += 1u32; 
} else { 
    hm.insert(tt.clone(), 1u32); 
} 

そして私は...

error: cannot borrow `hm` as mutable more than once at a time [E0499] 
     hm.insert(tt.clone(), 1u32); 
     ^~ 
note: first mutable borrow occurs here 
      if let Some(val) = hm.get_mut(tt) { 
          ^~ 
note: first borrow ends here 
      } 
      ^
help: run `rustc --explain E0499` to see a detailed explanation 

私はelseスコープの外hm.insert()を移動することで、これをバイパスすることができましたが、それは「非プログラム的」な方法のようなものだ...私はmatchを使用してみましたが、同じエラー(明らかに)が起きました。

私はこの問題を解決するにはどうすればよいですか?

答えて

2

これは、RustのHashMapの一般的な問題です。借り入れにはぎざぎざのエッジを使用できません。幸いにも、このケースを処理するためのAPIがあります。

HashMap::entry()を使用して、占有または空きのハッシュマップ上の場所を取得し、or_insert()を使用して、キーが存在しない場合は値を設定できます。

*hm.entry(tt).or_insert(0u32) += 1; 

これはそれがなかった場合は0でそれを充填、hm場所への参照を返し、それがあったものは何でもインクリメントします。

Rustの生涯は無償の競合になりがちですが、それは未知の問題ではありません。これは、将来のバージョンのRustでこれに取り組むためにa Rust's Rust core team member discussing plansです。今のところ、それを回避するライブラリメソッドがあります。

+0

これは本当に問題を解決するためのエレガントな方法です。ありがとう、仲間、そして私はEntry APIのために深く掘り下げます –

+0

これは興味深いです。あなたは、「借りたものはぎざぎざの縁を持つことはできません」という意味を明確にすることはできますか? –

+1

「ここにサビの現在のBDfLです」RustにはBDFLがありません。 –

関連する問題