マップの entry
メソッドとその利用例をいくつか紹介する。
マップ系の型 (HashMap
や BTreeMap
) の entry
メソッドは、エントリ編集系のよくある処理のためのヘルパメソッドである。これにより、その他の編集用メソッド (get
, get_mut
, insert
, remove
など) のみを使った場合と比べ、処理の効率化や、条件分岐の削減ができる場合がある。
pub fn entry(&mut self, key: K) -> Entry<'_, K, V>
引数と戻り値、およびその型について。
代表的な利用例。
以下、or_insert
メソッドを活用。
use std::collections::HashMap;
fn main() {
let mut map = HashMap::from([("A", false)]);
map.entry("A").or_insert(true);
map.entry("B").or_insert(true);
assert_eq!(map["A"], false);
assert_eq!(map["B"], true);
}
以下、and_modify
メソッドを活用。
use std::collections::HashMap;
fn main() {
let mut map = HashMap::from([("A", false)]);
map.entry("A").and_modify(|x| *x = true);
map.entry("B").and_modify(|x| *x = true);
assert_eq!(map.get("A"), Some(&true));
assert_eq!(map.get("B"), None);
}
以下、and_modify
と or_insert
を連結 (V
に Copy
トレイトが必要)。
use std::collections::HashMap;
use std::hash::Hash;
fn main() {
let mut map = HashMap::from([("A", false)]);
let v1 = *set_map_val(&mut map, "A", true);
let v2 = *set_map_val(&mut map, "B", true);
assert_eq!(v1, map["A"]);
assert_eq!(v2, map["B"]);
}
fn set_map_val<K, V>(map: &mut HashMap<K, V>, k: K, v: V) -> &V
where
K: Eq + Hash,
V: Copy,
{
map.entry(k).and_modify(|x| *x = v).or_insert(v)
}
以下、Vacant
と Ocupied
を個別に対応 (V
に Copy
トレイトは不要)。
use std::collections::HashMap;
use std::collections::hash_map::Entry::*;
use std::hash::Hash;
fn main() {
let mut map = HashMap::from([("A", false)]);
let v1 = *set_map_val(&mut map, "A", true);
let v2 = *set_map_val(&mut map, "B", true);
assert_eq!(v1, map["A"]);
assert_eq!(v2, map["B"]);
}
fn set_map_val<K, V>(map: &mut HashMap<K, V>, k: K, v: V) -> &V
where
K: Eq + Hash,
{
match map.entry(k) {
Vacant(x) => x.insert(v),
Occupied(x) => {
let vr = x.into_mut();
*vr = v;
vr
},
}
}