rust 在HashMap中推送到Vector时,“type `()`不能被解引用”

ozxc1zmp  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(124)

我正在完成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!")
            }
        }
    }
}

cs7cruho

cs7cruho1#

有谁能告诉我我做错了什么吗?
您正在尝试取消引用entry,这是完全不必要的,因为方法调用无论如何都会自动取消引用。
此外,*在Rust中的绑定能力非常低,因此您所编写的内容解析为

*(entry.push(name))

字符串
所以你尝试解引用Vec::push的结果,也就是(),它不是一个指针,因此不能被解引用,这正是编译器告诉你的:
类型()不能被取消引用

nx7onnlm

nx7onnlm2#

有一个优先级问题。目前,您的代码被理解为*(entry.push(name))而不是(*entry).push(name),这可能是您想要的,这就是为什么您会得到一个错误(entry.push(name)的类型为(),您不能取消引用)。
然而,这是无用的,因为Rust中的点运算符.将自动添加任何数量的引用(&&mut)并取消引用*,这就是为什么Rust能够输入entry.push(name)

相关问题