私は次のコードを書きました(+ デモ) を使用して、値に基づいてエントリを削除します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);