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