我有这个:
#[derive(FromPrimitive)]
pub enum MyEnum {
Var1 = 1,
Var2
}
错误:
error: cannot find derive macro `FromPrimitive` in this scope
|
38 | #[derive(FromPrimitive)]
| ^^^^^^^^^^^^^
为什么我会这样?我该如何解决?
答案 0 :(得分:10)
编译器有一个small set of built-in derive macros。对于任何其他人,您必须先导入自定义derive
s才能使用它们。
在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));
}
每个项目都有自己的包含自己的派生宏的包。一小部分样本:
FromPrimitive
)=&gt; num_derive
Serialize
,Deserialize
)=&gt; serde_derive
Insertable
,Queryable
)=&gt; diesel
(它实际上与常规箱子相同!)一些箱子重新导出他们的派生宏。例如,您可以使用derive
feature of Serde,然后直接从serde
包装箱中导入它:
[dependencies]
serde = { version = "1.0", features = ["derive"] }
FromPrimitive
实际上是 Rust 1.0之前标准库的一部分。它不足以继续存在于标准库中,因此它被移动到外部编号。某些非常旧的引用可能尚未针对此更改进行更新。
有关将C类枚举转换为整数的详细信息,请参阅: