|
|
|
@ -139,6 +139,7 @@ fn main() {
|
|
|
|
|
但是上面的代码有个问题,你需要为每个枚举成员都实现一个转换分支,非常麻烦。好在可以使用宏来简化,自动根据枚举的定义来实现`TryFrom`特征:
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
#[macro_export]
|
|
|
|
|
macro_rules! back_to_enum {
|
|
|
|
|
($(#[$meta:meta])* $vis:vis enum $name:ident {
|
|
|
|
|
$($(#[$vmeta:meta])* $vname:ident $(= $val:expr)?,)*
|
|
|
|
@ -174,7 +175,7 @@ back_to_enum! {
|
|
|
|
|
|
|
|
|
|
**这个方法原则上并不推荐,但是有其存在的意义,如果要使用,你需要清晰的知道自己为什么使用**。
|
|
|
|
|
|
|
|
|
|
在之前的类型转换章节,我们提到过非常邪恶的[`transmute`转换](<../basic/converse.md#变形记(Transmutes)>),其实,当你知道数值一定不会超过枚举的范围时(例如枚举成员对应 1,2,3,传入的整数也在这个范围内),就可以使用这个方法完成变形。
|
|
|
|
|
在之前的类型转换章节,我们提到过非常邪恶的[`transmute`转换](../../basic/converse.md#变形记transmutes),其实,当你知道数值一定不会超过枚举的范围时(例如枚举成员对应 1,2,3,传入的整数也在这个范围内),就可以使用这个方法完成变形。
|
|
|
|
|
|
|
|
|
|
> 最好使用#[repr(..)]来控制底层类型的大小,免得本来需要 i32,结果传入 i64,最终内存无法对齐,产生奇怪的结果
|
|
|
|
|
|
|
|
|
|