[rust] 学习 HashMap 的时候在标准库看到一段代码,为什么 map 变量可以解引用调用方法, map 应该不是引用吧,为什么可以用*

2023-02-02 10:48:58 +08:00
 proxytoworld

源码如下,不能理解*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);

692 次点击
所在节点    问与答
5 条回复
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
hsfzxjy
2023-02-02 11:00:18 +08:00
https://doc.rust-lang.org/std/collections/hash_map/enum.Entry.html#method.or_insert

因为 or_insert 就是返回了一个对值的可变引用
proxytoworld
2023-02-02 11:10:48 +08:00
@hsfzxjy
@ccvzz

传入 or_insert 的是 i32 类型,实现了 copy trait ,调用 or_insert 的时候传入的是复制的值吧,返回的是 Value 可变引用的话,引用指向的内存不在 map 里面吧,为什么还可以修改到 map["poneyland"]的值呢
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”.
proxytoworld
2023-02-02 16:32:38 +08:00
@ccvzz 理解了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/912494

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX