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

jer*_*rry 17 rust

我有这个:

#[derive(FromPrimitive)]
pub enum MyEnum {
    Var1 = 1,
    Var2
}
Run Code Online (Sandbox Code Playgroud)

还有一个错误:

error: cannot find derive macro `FromPrimitive` in this scope                                                                                                 
   |                                                                                                                                                          
38 | #[derive(FromPrimitive)]                                                                                                                                 
   |          ^^^^^^^^^^^^^   
Run Code Online (Sandbox Code Playgroud)

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

She*_*ter 23

编译器具有一小组内置的派生宏。对于其他任何人,必须先导入custom,derive然后才能使用它们。

在Rust 1.30之前,您需要#[macro_use]extern crate提供宏的板条箱中使用。使用Rust 1.30及更高版本,您可以use改为使用它们。

在这种情况下,您需要FromPrimitivenum_derive板条箱中导入:

在Rust 1.30之前

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

use num_traits::FromPrimitive;
Run Code Online (Sandbox Code Playgroud)

在Rust 1.30之后

use num_derive::FromPrimitive; // 0.2.4 (the derive)
use num_traits::FromPrimitive; // 0.2.6 (the trait)
Run Code Online (Sandbox Code Playgroud)

用法

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

fn main() {
    println!("{:?}", MyEnum::from_u8(2));
}
Run Code Online (Sandbox Code Playgroud)

每个项目都有自己的板条箱,其中包含自己的派生宏。一个小样本:

  • 编号(例如FromPrimitive)=>num_derive
  • SERDE(例如SerializeDeserialize)=>serde_derive
  • 柴油(例如InsertableQueryable)=> diesel(它实际上是一样的普通箱子!)

一些包装箱重新导出其派生宏。例如,您可以使用deriveSerde功能,然后serde直接从包装箱中导入它:

[dependencies]
serde = { version = "1.0", features = ["derive"] }
Run Code Online (Sandbox Code Playgroud)
use serde::{Serialize, Deserialize}; // imports both the trait and the derive macro
Run Code Online (Sandbox Code Playgroud)

FromPrimitive实际上 Rust 1.0 之前是标准库的一部分。继续存在于标准库中并没有足够的用处,因此将其移至外部num crate。一些非常老的参考可能尚未针对此更改进行更新。

有关将类C枚举与整数进行相互转换的更多信息,请参见:

  • 感谢您提到`features = [“ derive”]`。它节省了我的时间 (4认同)