Rust 惯用方式从映射中递减值并在值为 0 时删除键

问题描述 投票:0回答:1

Rust 新手,试图找出从哈希映射中递减值并在递减后的值达到 0 时删除相应键的 idomatic 方法。 我正在这样做,但不确定这是否是最好的方法:

use std::collections::HashMap;

fn main() {
    let mut frequency = HashMap::from([(2, 1), (3, 4), (5, 6)]);
    let key = 2;

    if let Some(val) = frequency.get_mut(&key) {
        *val -= 1;
        if *val == 0 {
            frequency.remove(&key);
        }
    }
    println!("{:?}", frequency);
}

我想到的另一个方法是对值使用 match 构造,如下所示:

use std::collections::HashMap;

fn main() {
    let mut frequency = HashMap::from([(2, 1), (3, 4), (5, 6)]);
    let key = 2;

    if let Some(val) = frequency.get_mut(&key) {
        match *val {
            1 => {
                frequency.remove(&key);
            }
            _ => *val -= 1,
        }
    }
    println!("{:?}", frequency);
}
rust hashmap pattern-matching rust-cargo
1个回答
0
投票

我认为没有惯用的方式来使用

if
match
。可读性是最重要的,所以这可能是您个人的选择(尽管您可以使用
match
跳过增量)。

但是,在这两种情况下,您都应该使用

entry()
以避免进行两次查找:

let mut frequency = HashMap::from([(2, 1), (3, 4), (5, 6)]);

if let Entry::Occupied(mut o) = frequency.entry(2) {
    *o.get_mut() -= 1;
    if *o.get() == 0 {
        o.remove_entry();
    }
}

使用

entry
,你甚至可以直接使用guards来匹配结果:

match frequency.entry(2) {
    Entry::Occupied(o) if *o.get() == 1 => {
        o.remove_entry();
    }
    Entry::Occupied(mut o) => *o.get_mut() -= 1,
    Entry::Vacant(_) => (),
};
© www.soinside.com 2019 - 2024. All rights reserved.