为什么Rust中HashMap的[]索引不返回引用,会触发移出错误?
Rust HashMap 索引操作返回类型问题解答
你遇到的报错本质是[]索引语法和直接调用index()方法的隐式行为差异:
- 首先你对
Indextrait的签名认知是正确的:index(&self, key: &Q) -> &V确实接收&self参数,返回值是值的不可变引用,不会转移所有权。 - 但
[]是Rust为Indextrait设计的语法糖,它会自动对index()的返回值做隐式解引用,等价于你写了*(m.index("aaa"))。所以你直接写let a = m["aaa"];时,相当于尝试把解引用后的String值的所有权转移给变量a,自然会触发「不能从HashMap中移出值」的报错。
你测试的几个合法写法的原理也很明确:
let a = m.index("aaa");你没有使用[]语法糖,直接调用方法就不会触发隐式解引用,拿到的就是原生返回的&String,自然不会有所有权问题。println!("{:?}", m["aaa"]);格式化宏内部只会读取[]返回值的引用,不会尝试转移所有权,等价于使用&*(m.index("aaa")),所以编译可以通过。- 如果你想通过
[]语法拿到引用,只需要主动加取引用符即可:let a = &m["aaa"];,效果和直接调用index()完全一致。
内容的提问来源于stack exchange,提问作者Joey
相关产品推荐
相关产品推荐

