定義列舉型別

一個列舉型別是一個型別 ,可容納的可能值的有限列表中的一個。在 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 功能。