値に基づいてHashMapからエントリを削除する 質問する

値に基づいてHashMapからエントリを削除する 質問する

私は次のコードを書きました(+ デモ) を使用して、値に基づいてエントリを削除しますHashMapうまく機能するが、借用チェッカーと戦っているように感じる以下を使用します:

  • clone()同じキーセットへの2つの参照を避けるため
  • let tmp =一時値の寿命を延ばすための追加のバインディング

use std::collections::HashMap;

fn strip_empties(x: &mut HashMap<String, i8>) {
    let tmp = x.clone();
    let empties = tmp
         .iter()
         .filter(|&(_, &v)| v == 0)
         .map(|(k, _)| k);

    for k in empties { x.remove(k); }
}

fn main() {
    let mut x: HashMap<String, i8> = HashMap::new();
    x.insert("a".to_string(), 1);
    x.insert("b".to_string(), 0);
    strip_empties(&mut x);

    println!("Now down to {:?}" , x);
}

これを実現するための、より簡潔で慣用的な方法はありますか?

ベストアンサー1

他の回答は古くなっています。Rust 1.27以降では、HashMap::retain関心のある要素のみを保持します。保持する要素はクロージャを使用して指定します。

x.retain(|_, v| *v != 0);

おすすめ記事