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如何实现相等,不过我们会在特性找到它们。