定义枚举类型

一个枚举类型是一个类型 ,可容纳的可能值的有限列表中的一个。在 Julia 中,枚举类型通常称为枚举类型。例如,可以使用枚举类型来描述一周中的七天,一年中的十二个月,标准 52 张牌组的四种套装或其他类似情况。

我们可以定义枚举类型来模拟标准 52 卡套牌的套装和等级。@enum 宏用于定义枚举类型。

@enum Suit ♣ ♦ ♥ ♠
@enum Rank ace=1 two three four five six seven eight nine ten jack queen king

这定义了两种类型:SuitRank。我们可以检查这些值确实是预期的类型:

julia> ♦
♦::Suit = 1

julia> six
six::Rank = 6

请注意,每个套装和等级都与一个数字相关联。默认情况下,此数字从零开始。所以第二套西装,钻石,被分配了数字 1.在 Rank 的情况下,将数字开始在一个更有意义。这是通过用 =1 注释注释 ace 的定义来实现的。

枚举类型具有许多功能,例如相等(实际上是标识)和内置的比较:

julia> seven === seven
true

julia> ten ≠ jack
true

julia> two < three
true

与任何其他不可变类型的值一样,枚举类型的值也可以在 Dicts 中进行散列和存储。

我们可以通过定义具有 RankSuit 字段的 Card 类型来完成此示例:

immutable Card
    rank::Rank
    suit::Suit
end

因此我们可以创建卡片

julia> Card(three, ♣)
Card(three::Rank = 3,♣::Suit = 0)

但枚举类型也有自己的 convert 方法,所以我们确实可以做到

julia> Card(7, ♠)
Card(seven::Rank = 7,♠::Suit = 3)

由于 7 可以直接转换为 Rank,因此这个构造函数可以直接使用。

我们可能希望定义用于构造这些卡的语法糖; 隐式乘法提供了一种方便的方法。限定

julia> import Base.*

julia> r::Int * s::Suit = Card(r, s)
* (generic function with 156 methods)

然后

julia> 10♣
Card(ten::Rank = 10,♣::Suit = 0)

julia> 5♠
Card(five::Rank = 5,♠::Suit = 3)

再次利用内置的 convert 功能。