我是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()
,因为取消引用(即*
)的优先级比方法调用的优先级弱。
因此它抱怨取消引用an,Option<u32>
因为这就是insert()
返回的结果。如果您确实想取消引用mymap
,则必须编写(*mymap).insert("hello world", 0);
。但是,Rust中不需要。
如果删除,*
则会遇到第二个问题,即您正在尝试mutate mymap
,这是不可变的引用。因此,要插入(例如mutate 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);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句