跳至內容

枚舉

注意

此頁面適用於 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

隱含常數 NoneAll 會自動新增至這些枚舉,其中 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 枚舉值