我有这个:
#[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改为使用它们。
在这种情况下,您需要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;
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_deriveSerialize,Deserialize)=>serde_deriveInsertable,Queryable)=> 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枚举与整数进行相互转换的更多信息,请参见:
| 归档时间: |
|
| 查看次数: |
8161 次 |
| 最近记录: |