问题描述
我是 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);
}