在 Rust 中创建字符串枚举
在本文中,我们将学习如何在 Rust 中创建字符串枚举。
在 Rust 中创建 enum
在 Rust 中,一个 enum
表示作为多个可能版本之一的数据。enum
关键字允许开发可能是几个可能版本之一的类型。
任何作为 struct
有效的版本也作为 enum
有效。此外,enum
中的每个版本都可以有可选的相关数据:
enum Information {
Quit,
ChangeColor(i32, i32, i32),
Move { x: i32, y: i32 },
Write(String),
}
存在没有数据的变体、具有命名数据的变体和具有匿名数据的变体。定义变体的语法模仿了定义诸如 tuple structs
之类的结构的语法。
与单个结构定义相比,enum
是单一类型。enum
值可以匹配任何变体。
这就是为什么枚举
经常被称为求和类型:潜在的枚举
值的集合是可能的变量值集合的总和。
我们使用 ::
语法来引用每个变体的名称,该名称由 enum
本身的名称限定。
Rust 中的弹奏
Strum
是 macros
和特性的集合,这些特性使得在 Rust
中使用 enums
和字符串更容易。
EnumString
:自动派生 std::str::FromStr
应用于 enum
。每个 enum
版本都将匹配其名称。
这可以通过在属性上使用 serialize="DifferentName"
或 string="DifferentName"
来覆盖,如下所示。可以将许多反序列化添加到相同的变体中。
如果变体包含其他数据,反序列化会将它们设置为默认值。default
属性可以应用于具有单个数据参数的元组变体。
如果未找到匹配项,则返回指定的变体,并将输入字符串作为参数捕获。这是由 EnumString
继承创建的代码示例。
#[derive(EnumString)]
enum Cars {
BMW,
Volvo { range:usize },
#[strum(serialize="Toyota",serialize="b")]
Toyota(usize),
#[strum(disabled="true")]
Fiat,
}
请注意,FromStr
的默认实现仅匹配变体的名称。Display
和 ToString
都返回指定的 enum
变体。这使你能够将单元样式变体从 enum
转换为字符串并再次转换回来。
此外,ToString
和 Display
根据以下标准选择适当的序列化。
- 如果存在字符串属性,将使用此值。每个版本只允许一个。
- 选择值最长的序列化属性。如果不需要此行为,请改用 to 字符串。
- 最后,如果
serialize
和to string
属性都不存在,将使用变体的名称。
Display
优于 ToString
所有实现 ::std::fmt::Display
的类型都有 ToString
的默认实现。
use std::string::ToString;
#[derive(Display, Debug)]
enum Cars {
#[strum(serialize="redred")]
BMW,
Volvo { range:usize },
Toyota(usize),
Ferrari,
}
fn debug_cars() {
let BMW = Cars::BMW;
assert_eq!(String::from("BMWBMW"), BMW.to_string());
}
fn main () { debug_cars(); }