修改 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);
我是 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);