V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
proxytoworld
V2EX  ›  问与答

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

  •  
  •   proxytoworld · 2023-02-02 10:48:58 +08:00 · 701 次点击
    这是一个创建于 660 天前的主题,其中的信息可能已经有所发展或是发生改变。

    源码如下,不能理解*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);
    
    
    5 条回复    2023-02-02 16:32:38 +08:00
    ccvzz
        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
    hsfzxjy
        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 就是返回了一个对值的可变引用
    proxytoworld
        3
    proxytoworld  
    OP
       2023-02-02 11:10:48 +08:00
    @hsfzxjy
    @ccvzz

    传入 or_insert 的是 i32 类型,实现了 copy trait ,调用 or_insert 的时候传入的是复制的值吧,返回的是 Value 可变引用的话,引用指向的内存不在 map 里面吧,为什么还可以修改到 map["poneyland"]的值呢
    ccvzz
        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”.
    proxytoworld
        5
    proxytoworld  
    OP
       2023-02-02 16:32:38 +08:00
    @ccvzz 理解了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   910 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:03 · PVG 06:03 · LAX 14:03 · JFK 17:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.