如何修复“在此范围内找不到派生宏”?

问题描述 投票:8回答:1

我有这个:

#[derive(FromPrimitive)]
pub enum MyEnum {
    Var1 = 1,
    Var2
}

还有一个错误:

error: cannot find derive macro `FromPrimitive` in this scope                                                                                                 
   |                                                                                                                                                          
38 | #[derive(FromPrimitive)]                                                                                                                                 
   |          ^^^^^^^^^^^^^   

为什么我这样做?我如何解决它?

rust
1个回答
15
投票

编译器有一个small set of built-in derive macros。对于任何其他人,您必须导入自定义derives才能使用它们。

在Rust 1.30之前,你需要在提供宏的箱子的#[macro_use]线上使用extern crate。使用Rust 1.30及以上版本,您可以改为使用use

在这种情况下,您需要从FromPrimitive箱中导入num_derive

在Rust 1.30之前

#[macro_use]
extern crate num_derive; // 0.2.4
extern crate num_traits; // 0.2.6

use num_traits::FromPrimitive;

在Rust 1.30之后

use num_derive::FromPrimitive; // 0.2.4 (the derive)
use num_traits::FromPrimitive; // 0.2.6 (the trait)

用法

#[derive(Debug, FromPrimitive)]
pub enum MyEnum {
    Var1 = 1,
    Var2,
}

fn main() {
    println!("{:?}", MyEnum::from_u8(2));
}

每个项目都有自己的包含自己的派生宏的包。小样本:

  • Num(例如FromPrimitive)=> num_derive
  • Serde(例如SerializeDeserialize)=> serde_derive
  • 柴油(例如InsertableQueryable)=> diesel(它实际上与常规箱子相同!)

一些箱子重新导出他们的派生宏。例如,您可以使用derive feature of Serde,然后直接从serde crate导入它:

[dependencies]
serde = { version = "1.0", features = ["derive"] }
use serde::{Serialize, Deserialize}; // imports both the trait and the derive macro

FromPrimitive实际上是Rust 1.0之前标准库的一部分。它不足以继续存在于标准库中,因此它被移动到外部编号。某些非常旧的引用可能尚未针对此更改进行更新。

有关将C类枚举转换为整数和从整数转换的更多信息,请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.