Fix typo in converse/enum-int.md

pull/439/head
lijinpeng 3 years ago
parent cf12bfb837
commit e19e7c319c

@ -1,15 +1,15 @@
# 整数转换为枚举 # 整数转换为枚举
在Rust中从枚举到整数的转换很容易但是反过来就没那么容易甚至部分实现还挺邪恶, 例如使用`transmute`。 Rust 中,从枚举到整数的转换很容易,但是反过来,就没那么容易,甚至部分实现还挺邪恶, 例如使用`transmute`。
## 一个真实场景的需求 ## 一个真实场景的需求
在实际场景中,从枚举到整数的转换有时还是非常需要的,例如你有一个枚举类型,然后需要从外面穿入一个整数,用于控制后续的流程走向,此时就需要用整数去匹配相应的枚举(你也可以用整数匹配整数-, -,看看会不会被喷)。 在实际场景中,从枚举到整数的转换有时还是非常需要的,例如你有一个枚举类型,然后需要从外面入一个整数,用于控制后续的流程走向,此时就需要用整数去匹配相应的枚举(你也可以用整数匹配整数-, -,看看会不会被喷)。
既然有了需求,剩下的就是看看该如何实现,这篇文章的水远比你想象的要深,且看八仙过海各显神通。 既然有了需求,剩下的就是看看该如何实现,这篇文章的水远比你想象的要深,且看八仙过海各显神通。
## C语言的实现 ## C语言的实现
对于C语言来说万物皆邪恶因此我们不讨论安全只看实现不得不说很简洁 对于 C 语言来说,万物皆邪恶,因此我们不讨论安全,只看实现,不得不说很简洁:
```C ```C
#include <stdio.h> #include <stdio.h>
@ -32,7 +32,7 @@ int main(void)
} }
``` ```
但是在Rust中以下代码 但是在 Rust 中,以下代码:
```rust ```rust
enum MyEnum { enum MyEnum {
A = 1, A = 1,
@ -57,7 +57,7 @@ fn main() {
就会报错: `MyEnum::A => {} mismatched types, expected i32, found enum MyEnum` 就会报错: `MyEnum::A => {} mismatched types, expected i32, found enum MyEnum`
## 使用三方库 ## 使用三方库
首先可以想到的肯定是三方库毕竟Rust的生态目前已经发展的很不错类似的需求总是有的这里我们先使用`num-traits`和`num-derive`来试试。 首先可以想到的肯定是三方库,毕竟 Rust 的生态目前已经发展的很不错,类似的需求总是有的,这里我们先使用`num-traits`和`num-derive`来试试。
在`Cargo.toml`中引入: 在`Cargo.toml`中引入:
```toml ```toml
@ -93,7 +93,7 @@ fn main() {
除了上面的库,还可以使用一个较新的库: [`num_enums`](https://github.com/illicitonion/num_enum)。 除了上面的库,还可以使用一个较新的库: [`num_enums`](https://github.com/illicitonion/num_enum)。
## TryFrom + 宏 ## TryFrom + 宏
在Rust1.34后,可以实现`TryFrom`特征来做转换: Rust 1.34 后,可以实现`TryFrom`特征来做转换:
```rust ```rust
use std::convert::TryFrom; use std::convert::TryFrom;
@ -180,7 +180,7 @@ enum MyEnum {
fn main() { fn main() {
let x = MyEnum::C; let x = MyEnum::C;
let y = x as i32; let y = x as i32;
let z: MyEnum = unsafe { ::std::mem::transmute(y) }; let z: MyEnum = unsafe { std::mem::transmute(y) };
// match the enum that came from an int // match the enum that came from an int
match z { match z {
@ -191,10 +191,10 @@ fn main() {
} }
``` ```
既然是邪恶之王当然得有真本事无需标准库、也无需unstable的Rust版本我们就完成了转换awesome!?? 既然是邪恶之王,当然得有真本事,无需标准库、也无需 unstable Rust 版本我们就完成了转换awesome!??
## 总结 ## 总结
本文列举了常用(其实差不多也是全部了还有一个unstable特性没提到)的从整数转换为枚举的方式,推荐度按照出现的先后顺序递减。 本文列举了常用(其实差不多也是全部了,还有一个 unstable 特性没提到)的从整数转换为枚举的方式,推荐度按照出现的先后顺序递减。
但是推荐度最低,不代表它就没有出场的机会,只要使用边界清晰,一样可以大光彩,例如最后的`transmute`函数. 但是推荐度最低,不代表它就没有出场的机会,只要使用边界清晰,一样可以大光彩,例如最后的`transmute`函数.
Loading…
Cancel
Save