2017-09-26 7 views
2

私は2つのHashMapを持っており、特定の条件下で値を入れ替えたいと思っています。キーが2番目のHashMapに存在しない場合は、挿入する必要があります。値段が高す​​ぎるので値を複製したくない。2つのハッシュマップ間の値を入れ替えます

次のように動作しない(簡体字)重要なコードは次のとおりです。

Rust Playgroundオン)
match hm1.get_mut(&1) { 
    Some(ref mut x) => match hm.entry(1) { 
     Entry::Occupied(mut y) => if y.get().replace { 
      mem::swap(x, &mut y.get_mut()); 
     }, 
     Entry::Vacant(y) => { 
      y.insert(mem::replace(x, dummy)); 
     } 
    }, 
    None => {} 
} 

私はエラーを取得する:

error[E0597]: `y` does not live long enough 
    --> src/main.rs:28:9 
    | 
23 |     mem::swap(x, &mut y.get_mut()); 
    |         - borrow occurs here 
... 
28 |   }, 
    |  ^`y` dropped here while still borrowed 
29 |   None => {} 
30 |  } 
    |  - borrowed value needs to live until here 

私は本当に混乱していますこれについては、私はそれを修正する方法はありません。 Entrymatch hm.get_mut(1)に置き換えた場合、一致がHashMapをそのまま借りてくるため、Noneケースには挿入できません。

答えて

5

参考にする必要がある参考文献への参照をしています。例えば

&mut y.get_mut() 

&mut &mut ExpensiveStruct 

であり、あなたが

match hm1.get_mut(&1) { 
    Some(ref mut x) => 

あなたのコードをまねた問題を抱えているタイプは&mut ExpensiveStructまでトリミングされたときに期待どおりに動作:

match hm1.get_mut(&1) { 
    Some(x) => match hm.entry(1) { 
     Entry::Occupied(mut y) => if y.get().replace { 
      mem::swap(x, y.get_mut()); 

hm1.get_mut(&1)既に変更可能な参照用Optionを返し、y.get_mut()は既に参照を返すため&mutが除去されるためref mutが、除去されることOn the Playground

注意。

関連する問題