コンテンツへスキップ

列挙型

注記

このページは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の値は0Allの値はすべての定数の「または」演算の結果です。

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列挙型値を参照してください。