ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
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` ](http://doc.rust-lang.org/nightly/book/match.html)表达式模式匹配变量,你会在下一部分学到它。我们还不够了解Rust如何实现相等,不过我们会在[特性](http://doc.rust-lang.org/nightly/book/traits.html)找到它们。