在 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 中的弹奏

Strummacros 和特性的集合,这些特性使得在 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 的默认实现仅匹配变体的名称。DisplayToString 都返回指定的 enum 变体。这使你能够将单元样式变体从 enum 转换为字符串并再次转换回来。

此外,ToStringDisplay 根据以下标准选择适当的序列化。

  1. 如果存在字符串属性,将使用此值。每个版本只允许一个。
  2. 选择值最长的序列化属性。如果不需要此行为,请改用 to 字符串。
  3. 最后,如果 serializeto string 属性都不存在,将使用变体的名称。

Display 优于 ToString 所有实现 ::std::fmt::Display 的类型都有 ToString 的默认实现。

usestd::string::ToString;#[derive(Display, Debug)]enum Cars{#[strum(serialize="redred")]BMW,Volvo{range:usize },Toyota(usize),Ferrari,}fn debug_cars(){letBMW=Cars::BMW;assert_eq!(String::from("BMWBMW"),BMW.to_string());}fn main(){debug_cars();}