定义枚举类型
一个枚举类型是一个类型 ,可容纳的可能值的有限列表中的一个。在 Julia 中,枚举类型通常称为枚举类型。例如,可以使用枚举类型来描述一周中的七天,一年中的十二个月,标准 52 张牌组的四种套装或其他类似情况。
我们可以定义枚举类型来模拟标准 52 卡套牌的套装和等级。@enum
宏用于定义枚举类型。
@enum Suit ♣ ♦ ♥ ♠
@enum Rank ace=1 two three four five six seven eight nine ten jack queen king
这定义了两种类型:Suit
和 Rank
。我们可以检查这些值确实是预期的类型:
julia> ♦
♦::Suit = 1
julia> six
six::Rank = 6
请注意,每个套装和等级都与一个数字相关联。默认情况下,此数字从零开始。所以第二套西装,钻石,被分配了数字 1.在 Rank
的情况下,将数字开始在一个更有意义。这是通过用 =1
注释注释 ace
的定义来实现的。
枚举类型具有许多功能,例如相等(实际上是标识)和内置的比较:
julia> seven === seven
true
julia> ten ≠ jack
true
julia> two < three
true
与任何其他不可变类型的值一样,枚举类型的值也可以在 Dict
s 中进行散列和存储。
我们可以通过定义具有 Rank
和 Suit
字段的 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
功能。