修改 HashMap 中条目值的正确方法是什么?

What is the proper way of modifying a value of an entry in a HashMap?

我是 Rust 的初学者,我还没有读完这本书,但是有一件事让我提出了这个问题。

考虑这段代码:

fn main() {
    let mut entries = HashMap::new();
    entries.insert("First".to_string(), 10);
    entries.entry("Second".to_string()).or_insert(20);

    assert_eq!(10, *entries.get("First").unwrap());

    entries.entry(String::from("First")).and_modify(|value| { *value = 20});

    assert_eq!(20, *entries.get("First").unwrap());

    entries.insert("First".to_string(), 30);

    assert_eq!(30, *entries.get("First").unwrap());

}

我使用过两种修改条目的方法:

entries.entry(String::from("First")).and_modify(|value| { *value = 20});
entries.insert("First".to_string(), 30);

insert 方法看起来很笨拙,我个人也没有用它来修改条目中的值,但是......它有效。然而,除了语义之外,还有不使用它的理由吗?正如我所说,我宁愿使用 entry 构造,而不是仅使用 insert 和现有密钥来强制更新。像我这样的新手 Rustacean 不可能知道的东西?

当您替换整​​个值时,

insert() 有点惯用,特别是当您不知道(或不关心)该值是否存在时。

get_mut() 当您想要对需要可变性的值执行某些操作时,例如仅替换结构的一个字段或调用需要可变引用的方法,则更符合惯用语。如果您知道密钥存在,您可以使用 .unwrap(),否则您可以使用其他 Option 实用程序之一或 match.

entry(...).and_modify(...) 本身 很少是惯用语;它在将 Entry 的其他方法链接在一起时更有用,例如如果值存在则要修改的位置,否则添加不同的值。在使用值为总计的地图时,您可能会看到这种模式:

entries.entry(key)
    .and_modify(|v| *v += 1)
    .or_insert(1);