列挙型¶
注記
このページは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列挙型値を参照してください。