为什么会出现“无法在此作用域中派生宏”错误?

13

使用 cargo build 命令编译这段代码:

#![allow(unused)]

use serde::{Deserialize, Serialize};
use serde_json::{Result, Value};

#[derive(Serialize, Deserialize,Debug)]
struct Repository{
    r#type: String,
    url: String,
}

fn main() {
    println!("Hello, world!");
}

这里是 cargo.toml 文件:

[package]
name = "demo_err"
version = "0.1.0"
authors = ["Onorio Catenacci <catenacci@ieee.org>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
serde = "1.0.104"
serde_json = "1.0.44"

当然,我的实际代码略大,但这是我可以重现错误的最小代码片段。
我得到了以下错误:
   Compiling demo_err v0.1.0 (U:\skunkworks\rust\demo_err)
error: cannot find derive macro `Serialize` in this scope
 --> src\main.rs:9:10
  |
9 | #[derive(Serialize, Deserialize,Debug)]
  |          ^^^^^^^^^

error: cannot find derive macro `Deserialize` in this scope
 --> src\main.rs:9:21
  |
9 | #[derive(Serialize, Deserialize,Debug)]
  |                     ^^^^^^^^^^^

现在我会认为自己做错了什么- 除了这个样例代码来自serde_json。 它看起来像这样:

use serde::{Deserialize, Serialize};
use serde_json::Result;

#[derive(Serialize, Deserialize)]
struct Person {
    name: String,
    age: u8,
    phones: Vec<String>,
}

现在,一个明显的不同之处是“r#type”,但使用不同的名称并不能解决错误。另一个明显的区别是“serde_json::{Result, Value}”,但删除“Value”也不能解决错误。
显然,我的代码与该示例之间存在某些差异,但我无论如何都无法弄清楚不同之处。请有人能指点我吗?
编辑:
是的,我知道还有另一个问题需要相同的所需功能才能解决。但是,在这种情况下呈现的错误消息与其他情况下呈现的错误不同。我不希望有人能够将两种不同的错误方案转化为相同的解决方案。请保持此项开放。
具体来说是这个:
错误:无法在该范围内找到派生宏“Serialize”
这是我主要询问的内容,而不是这个:
警告:未使用的导入:Deserialize、Serialize 这是其他问题的主要点。

这个回答解决了你的问题吗?Rust同时说导入未使用和找不到导入语句 - BinaryButterfly
虽然涉及的机制相同,但错误呈现方式不同。是的,这两个问题的解决方案是相同的,但正如我所说,在这种情况下呈现给我的错误不同,因此我不认为其他问答可以回答这个问题。 - Onorio Catenacci
1个回答

33

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