5.13.枚举

Rust有一个”集合类型“,一个enum。枚举是Rust一个极为有用的功能,他被用到了整个标准库中。枚举是一个类型,它把一系列互不相交的值绑到一起。举个例子来说,下面我们定义了一个Character,它的值只能是Digit或其它。

enum Character {
    Digit(i32),
    Other,
}

大部分类型允许作为一个enum的变量部分。这里是一些例子:

struct Empty;
struct Color(i32, i32, i32);
struct Length(i32);
struct Status { Health: i32, Mana: i32, Attack: i32, Defense: i32 }
struct HeightDatabase(Vec<i32>);

你也看到了,依据它的类型,enum变量可以或可以不储存数据。例如在Character中,Digit给了一个i32值有意义的名字,而Other只是一个名字。然而,它们表现为Character的不同分类是非常有用的属性。

enum的变量默认不能使用相等运算符比较(==!=),没有大小(=等),也不支持其它的像*+这样的双目运算符。这样,下面的代码作为Character类型的例子是无效的:

// These assignments both succeed
let ten  = Character::Digit(10);
let four = Character::Digit(4);

// Error: `*` is not implemented for type `Character`
let forty = ten * four;

// Error: `<=` is not implemented for type `Character`
let four_is_smaller = four <= ten;

// Error: `==` is not implemented for type `Character`
let four_equals_ten = four == ten;

我们使用::语法来使用每个变量的名字:它们包含在enum名字自身中。这允许这两种情况可行:

Character::Digit(10);
Hand::Digit;

这两个变量都叫Digit,不过它们包含在不同的enum名字中。

不支持这些操作可能看起来更像限制。不过这是一个我们可以克服的限制。这里有两种方法:我们自己实现相等(比较),或通过match 表达式模式匹配变量,你会在下一部分学到它。我们还不够了解Rust如何实现相等,不过我们会在特性找到它们。

文章导航