我正在完成Rust书第8章中的练习。但这个问题并不是演习所特有的。具体到这一行:*entry.push(name)
。我试图解引用条目以获取向量来推送我的值,但我得到了这个错误:
error[E0614]: type `()` cannot be dereferenced
--> src/main.rs:36:17
|
36 | *entry.push(name)
| ^^^^^^^^^^^^^^^^^
字符串
根据VSCode的Rust分析器,entry
的类型是&mut Vec<&&str>
。我怀疑是&&
而不是单个&
导致了这个问题。但我不知道为什么VSCode会这么想。有谁能告诉我我做错了什么吗?
下面是完整的代码:
use std::{io::{self}, collections::HashMap};
fn main() {
let mut store = HashMap::new();
loop {
println!("Enter a command:");
let mut command = String::new();
io::stdin()
.read_line(&mut command)
.expect("Failed to read command");
let split_command: Vec<&str> = command.split_whitespace().collect();
match split_command.as_slice() {
["Add", name, "to", department] => {
let entry = store.entry(department).or_insert(Vec::new());
*entry.push(name)
},
["Exit"] => {
break;
},
["Show", ..] => {
},
[_, ..] => {
},
[] => {
println!("No command!")
}
}
}
}
型
2条答案
按热度按时间cs7cruho1#
有谁能告诉我我做错了什么吗?
您正在尝试取消引用
entry
,这是完全不必要的,因为方法调用无论如何都会自动取消引用。此外,
*
在Rust中的绑定能力非常低,因此您所编写的内容解析为字符串
所以你尝试解引用
Vec::push
的结果,也就是()
,它不是一个指针,因此不能被解引用,这正是编译器告诉你的:类型
()
不能被取消引用nx7onnlm2#
有一个优先级问题。目前,您的代码被理解为
*(entry.push(name))
而不是(*entry).push(name)
,这可能是您想要的,这就是为什么您会得到一个错误(entry.push(name)
的类型为()
,您不能取消引用)。然而,这是无用的,因为Rust中的点运算符
.
将自动添加任何数量的引用(&
或&mut
)并取消引用*
,这就是为什么Rust能够输入entry.push(name)
。