源码如下,不能理解*map.entry("poneyland").or_insert(10) *= 2;
为什么 map 可以用*解引用,并且可以修改到 map 里面的值
use std::collections::HashMap;
let mut map: HashMap<&str, u32> = HashMap::new();
map.entry("poneyland").or_insert(3);
assert_eq!(map["poneyland"], 3);
*map.entry("poneyland").or_insert(10) *= 2;
assert_eq!(map["poneyland"], 6);
1
ccvzz 2023-02-02 10:59:17 +08:00
method call 优先于解引用 https://doc.rust-lang.org/reference/expressions.html#expression-precedence
所以*作用于 or_insert 方法的返回值 (Value 的可变引用): pub fn or_insert(self, default: V) -> &'a mut V |
2
hsfzxjy 2023-02-02 11:00:18 +08:00 via Android
https://doc.rust-lang.org/std/collections/hash_map/enum.Entry.html#method.or_insert
因为 or_insert 就是返回了一个对值的可变引用 |
3
proxytoworld OP |
4
ccvzz 2023-02-02 11:26:12 +08:00
@proxytoworld 引用指向的内存是 map 里面的
见 https://doc.rust-lang.org/src/std/collections/hash/map.rs.html#2515 : returns a mutable reference to the value “in the entry”. |
5
proxytoworld OP @ccvzz 理解了
|