2017-05-10 4 views
2

次のコードは機能しますが、is_emptyの定義が使用方法から離れすぎているため、表示されません。HashMapから空の値を削除する方法は何ですか?

fn remove(&mut self, index: I, primary_key: &Rc<K>) { 
    let is_empty; 
    { 
     let ks = self.data.get_mut(&index).unwrap(); 
     ks.remove(primary_key); 
     is_empty = ks.is_empty(); 
    } 
    // I have to wrap `ks` in an inner scope so that we can borrow `data` mutably. 
    if is_empty { 
     self.data.remove(&index); 
    } 
} 

ifブランチを入力する前に条件変数を削除する方法はありますか?

if {ks.is_empty()} { 
    self.data.remove(&index); 
} 

答えて

7

キーをダブルルックアップすると、いつでもEntry APIと考える必要があります。エントリーAPIで

、あなたはキーと値のペアのハンドルを取得し、次のことができます。

  • キーを読み、
  • 読み取り/値を変更し、
  • 取得(完全エントリを削除キーと値を返します)。

非常に強力です。

use std::collections::HashMap; 
use std::collections::hash_map::Entry; 

fn remove(hm: &mut HashMap<i32, String>, index: i32) { 
    if let Entry::Occupied(o) = hm.entry(index) { 
     if o.get().is_empty() { 
      o.remove_entry(); 
     } 
    } 
} 

fn main() { 
    let mut hm = HashMap::new(); 
    hm.insert(1, String::from("")); 

    remove(&mut hm, 1); 

    println!("{:?}", hm); 
} 
0

私は最後にこれをしなかった:

match self.data.entry(index) { 
    Occupied(mut occupied) => { 
     let is_empty = { 
      let ks = occupied.get_mut(); 
      ks.remove(primary_key); 
      ks.is_empty() 
     }; 
     if is_empty { 
      occupied.remove(); 
     } 

    }, 
    Vacant(_) => unreachable!() 
} 
この場合

関連する問題