在 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(); }