簡體   English   中英

如何修復“在此范圍內找不到派生宏”?

[英]How do I fix "cannot find derive macro in this scope"?

我有這個:

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

還有一個錯誤:

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

為什么我得到這個? 我如何解決它?

編譯器有一小組內置的派生宏 對於任何其他人,您必須先導入自定義的derive s,然后才能使用它們。

在 Rust 1.30 之前,您需要在提供宏的 crate 的extern crate行上使用#[macro_use] 在 Rust 1.30 及更高版本中,您可以use它們。

在這種情況下,您需要從num_derive包中導入FromPrimitive

在 Rust 1.30 之后

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

在 Rust 1.30 之前

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

use num_traits::FromPrimitive;

用法

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

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

每個項目都有自己的包,其中包含自己的派生宏。 一個小樣本:

  • Num(例如FromPrimitive )=> num_derive
  • Serde(例如SerializeDeserialize )=> serde_derive
  • Diesel(例如InsertableQueryable )=> diesel (它實際上和普通箱子一樣!)

一些板條箱重新導出它們的派生宏。 例如,您可以使用Serde 的derive功能,然后直接從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之前標准庫的一部分。 它不足以繼續存在於標准庫中,因此它被移至外部 num crate。 一些非常舊的參考資料可能沒有針對此更改進行更新。

有關將類 C 枚舉與整數相互轉換的更多信息,請參閱:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM