枚舉¶
注意
此頁面適用於 Crystal 枚舉。關於 C 枚舉,請參閱 C 綁定枚舉。
枚舉是一組整數值,其中每個值都有一個相關聯的名稱。例如
enum Color
Red
Green
Blue
end
枚舉使用 enum
關鍵字定義,後接其名稱。枚舉的主體包含值。值從 0
開始,並遞增 1。預設值可以覆寫
enum Color
Red # 0
Green # 1
Blue = 5 # overwritten to 5
Yellow # 6 (5 + 1)
end
枚舉中的每個常數都具有枚舉的類型
Color::Red # :: Color
要取得底層值,您可以在其上呼叫 value
Color::Green.value # => 1
值的類型預設為 Int32
,但可以更改
enum Color : UInt8
Red
Green
Blue
end
Color::Red.value # :: UInt8
只允許使用整數類型作為底層類型。
所有枚舉都繼承自 Enum。
旗標枚舉¶
枚舉可以使用 @[Flags]
註解標記。這會更改預設值
@[Flags]
enum IOMode
Read # 1
Write # 2
Async # 4
end
@[Flags]
註解會使第一個常數的值為 1
,而後續常數則乘以 2
。
隱含常數 None
和 All
會自動新增至這些枚舉,其中 None
的值為 0
,而 All
的值為所有常數的「或」運算值。
IOMode::None.value # => 0
IOMode::All.value # => 7
此外,某些 Enum
方法會檢查 @[Flags]
註解。例如
puts(Color::Red) # prints "Red"
puts(IOMode::Write | IOMode::Async) # prints "Write, Async"
從整數建立枚舉¶
可以從整數建立枚舉
puts Color.new(1) # => prints "Green"
允許使用不對應於枚舉常數的值:該值仍然是 Color
類型,但在列印時會取得底層值
puts Color.new(10) # => prints "10"
此方法的主要目的是將 C 中的整數轉換為 Crystal 中的枚舉。
方法¶
就像類別或結構一樣,您可以為枚舉定義方法
enum Color
Red
Green
Blue
def red?
self == Color::Red
end
end
Color::Red.red? # => true
Color::Blue.red? # => false
允許使用類別變數,但不允許使用實例變數。
用法¶
當方法參數具有枚舉 類型限制 時,它會接受枚舉常數或 符號。符號會自動轉換為枚舉常數,如果轉換失敗,則會引發編譯時期錯誤。
def paint(color : Color)
puts "Painting using the color #{color}"
end
paint Color::Red
paint :red # automatically casts to `Color::Red`
paint :yellow # Error: expected argument #1 to 'paint' to match a member of enum Color
相同的自動轉換不適用於 case 語句。若要將枚舉與 case 語句搭配使用,請參閱 case 枚舉值。