Rust:在哈希图参考中插入 uint

问题描述

我是 Rust 的新手,我在编译时遇到了这个错误,但我不明白

error[E0614]: type `Option<u32>` cannot be dereferenced
 --> src/main.rs:9:5
  |
9 |     *mymap.insert("hello world",0);
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

这是我为重现问题而简化的代码

use std::collections::HashMap;

fn main() {
    let mymap: HashMap<&str,u32> = HashMap::new();
    f(&mymap)
}

fn f(mymap: &HashMap<&str,u32>) {
    *mymap.insert("hello world",0);
}

以下也不起作用

*mymap.insert("hello world",&0);

我没有通过谷歌搜索找到问题的根本原因,我想我没有这个词。看起来像是借贷问题。

解决方法

您实际上不是在取消引用 mymap,您实际上是在取消引用 insert() 的结果,因为 dereferencing (i.e. *) have a weaker precedence than a method call

所以它抱怨取消引用 Option<u32> 因为那是 insert() 返回的。如果您确实想取消引用 mymap,则必须编写 (*mymap).insert("hello world",0);。然而,这在 Rust 中是不需要的。

如果您删除 *,那么您会遇到第二个问题,那就是您试图改变 mymap,这是一个不可变的引用。因此,为了能够插入,即在 mymap 中改变 f,您需要向它传递一个可变引用,即 mymap: &mut HashMap<&str,u32>

use std::collections::HashMap;

fn main() {
    let mut mymap: HashMap<&str,u32> = HashMap::new();
    f(&mut mymap)
}

fn f(mymap: &mut HashMap<&str,u32>) {
    mymap.insert("hello world",0);
}
,

您不需要取消对方法调用的引用,Rust 会自动为您完成。此外,您需要传递 mymap 的可变引用,以便您可以实际执行 insert。固定示例:

use std::collections::HashMap;

fn main() {
    let mut mymap: HashMap<&str,0);
}

playground