在 Rust 中创建字符串枚举

Nilesh Katuwal 2023年1月30日
  1. 在 Rust 中创建 enum
  2. Rust 中的弹奏
在 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 的默认实现。

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

相关文章 - Rust String