Rust提示导入未使用,同时找不到已导入的语句

14

我有一些结构体想要使用Serde。就像这样:

use serde::{Serialize, Deserialize};

#[derive(Serialize)]
struct GetLinkResponse {
    error: String,
    link: String,
}

但编译器报告如下:

  1. Serialize 导入未使用
  2. Serialize 无法找到
error: cannot find derive macro `Serialize` in this scope
 --> src/structs.rs:3:10
  |
3 | #[derive(Serialize)]
  |          ^^^^^^^^^

warning: unused imports: `Deserialize`, `Serialize`
 --> src/structs.rs:1:13
  |
1 | use serde::{Serialize, Deserialize};
  |             ^^^^^^^^^  ^^^^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

我猜我对use的工作方式还不太理解。有人能解释一下我在这里犯了什么错吗?

1个回答

32

你遇到了自动特性实现背后的“魔法”,即过程宏。通常,人们会将实现特性的过程宏命名为与特性相同的名称(因为这很方便)。这里有一个特性 serde::Serialize,但也有一个自动实现该特性的过程宏 serde::Serialize

它们不冲突,因为它们存在于不同的命名空间中,编译器可以从上下文中推断出是宏还是特性。

在你的情况下,你忘记添加 derive 特性,因此在 serde 中没有 proc 宏。 因此,你正在导入未使用的特性,并尝试使用不存在的 proc 宏。

解决方案是使用 serde 的 derive 特性

serde = { version = "1.0", features = ["derive"] }

2
天啊,这些功能正在扼杀我的 Rust 情绪 :) - taras
3
@TarasMatsyk 是的,这常常是令人沮丧的源头,但你会逐渐习惯,并很快理解问题的根源。 - Boiethios

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接