迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 >

在 Rust 中创建字符串枚举

作者:迹忆客 最近更新:2023/03/21 浏览次数:

在本文中,我们将学习如何在 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(); }

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

用 Rust 读写文件

发布时间:2023/03/21 浏览次数:152 分类:编程语言

本教程演示了在不同版本的 Rust 中读取和写入文件的方式。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便