abstract struct Enum
Overview
Enum is the base type of all enums.
An enum is a set of integer values, where each value has an associated name. For example:
enum Color
Red # 0
Green # 1
Blue # 2
end
Values start with the value 0 and are incremented by one, but can be overwritten.
To get the underlying value you invoke value on it:
Color::Green.value # => 1
Each constant (member) in the enum has the type of the enum:
typeof(Color::Red) # => Color
Flags enum
An enum can be marked with the @[Flags] attribute. This changes the default values:
@[Flags]
enum IOMode
Read # 1
Write # 2
Async # 4
end
Additionally, some methods change their behaviour.
Enums from integers
An enum can be created from an integer:
puts Color.new(1) # => prints "Green"
Values that don't correspond to an enum's constants are allowed: the value will still be of type Color, but when printed you will get the underlying value:
puts Color.new(10) # => prints "10"
This method is mainly intended to convert integers from C to enums in Crystal.
Question methods
An enum automatically defines question methods for each member, using String#underscore
for the
method name. If the case of regular enums, this compares by equality (#==
). In the case of flags enums,
this invokes #includes?
. For example:
color = Color::Blue
color.red? # => false
color.blue? # => true
mode = IOMode::Read | IOMode::Async
mode.read? # => true
mode.write? # => false
mode.async? # => true
This is very convenient in case
expressions:
case color
when .red?
puts "Got red"
when .blue?
puts "Got blue"
end
Included Modules
Defined in:
enum.crjson/to_json.cr
yaml/to_yaml.cr
Class Method Summary
-
.from_value(value) : self
Returns the enum member that has the given value, or raises if no such member exists.
-
.from_value?(value) : self | Nil
Returns the enum member that has the given value, or
nil
if no such member exists. - .names : Array(String)
- .new(pull : JSON::PullParser)
- .new(pull : YAML::PullParser)
-
.parse(string) : self
Returns the enum member that has the given name, or raises
ArgumentError
if no such member exists. -
.parse?(string) : self | Nil
Returns the enum member that has the given name, or
nil
if no such member exists. -
.values : Array(self)
Returns all enum members as an
Array(self)
.
Instance Method Summary
-
#&(other : self)
Returns the enum member that results from applying a logical "and" operation between this enum member's value and other.
-
#+(other : Int)
Returns the enum member that results from adding other to this enum member's value.
-
#-(other : Int)
Returns the enum member that results from subtracting other to this enum member's value.
-
#<=>(other : self)
Compares this enum member against another, according to their underlying value.
-
#==(other : self)
Returns
true
if this enum member and other have the same underlying value. -
#^(other : self)
Returns the enum member that results from applying a logical "xor" operation between this enum member's value and other.
- #clone
-
#hash
Returns a hash value.
-
#includes?(other : self)
Returns
true
if this enum member's value includes other. -
#to_f32 : Float32
Returns the value of this enum member as a
Float32
-
#to_f64 : Float64
Returns the value of this enum member as a
Float64
-
#to_i : Int32
Returns the value of this enum member as an
Int32
. -
#to_i16 : Int16
Returns the value of this enum member as a
Int16
-
#to_i32 : Int32
Returns the value of this enum member as a
Int32
-
#to_i64 : Int64
Returns the value of this enum member as a
Int64
-
#to_i8 : Int8
Returns the value of this enum member as a
Int8
- #to_json(io)
-
#to_s : String
Returns a String representation of this enum member.
-
#to_s(io : IO) : Nil
Appends a String representation of this enum member to the given IO.
-
#to_u16 : UInt16
Returns the value of this enum member as a
UInt16
-
#to_u32 : UInt32
Returns the value of this enum member as a
UInt32
-
#to_u64 : UInt64
Returns the value of this enum member as a
UInt64
-
#to_u8 : UInt8
Returns the value of this enum member as a
UInt8
- #to_yaml(emitter : YAML::Emitter)
-
#|(other : self)
Returns the enum member that results from applying a logical "or" operation between this enum member's value and other.
-
#~
Returns the enum member that results from applying a logical "not" operation of this enum member's value.
Macro Summary
-
flags(*values)
Convenience macro to create a combined enum (combines given members using
#|
(or) logical operator)
Instance methods inherited from module Comparable({"T", T})
<(other : T)
<,
<=(other : T)
<=,
<=>(other : T)
<=>,
==(other : T)
==,
>(other : T)
>,
>=(other : T)
>=
Instance methods inherited from struct Value
==(other)
==,
dup
dup
Instance methods inherited from class Object
!=(other)
!=,
!~(other)
!~,
==(other)
==,
===(other)===(other : YAML::Any)
===(other : JSON::Any) ===, =~(other) =~, class class, crystal_type_id crystal_type_id, dup dup, hash hash, inspect(io : IO)
inspect inspect, itself itself, not_nil! not_nil!, tap(&block) tap, to_json to_json, to_pretty_json(indent : String = " ")
to_pretty_json(io : IO, indent : String = " ") to_pretty_json, to_s
to_s(io : IO) to_s, to_yaml
to_yaml(io : IO) to_yaml, try(&block) try
Class methods inherited from class Object
==(other : Class)
==,
===(other)
===,
cast(other) : self
cast,
clone
clone,
dup
dup,
from_json(string_or_io) : selffrom_json(string_or_io, root : String) : self from_json, from_yaml(string : String) : self from_yaml, hash hash, inspect(io) inspect, name : String name, nilable? nilable?, to_s(io) to_s, |(other : U.class) forall U |
Class Method Detail
Returns the enum member that has the given value, or raises if no such member exists.
Color.from_value(0) # => Color::Red
Color.from_value(1) # => Color::Green
Color.from_value(2) # => Color::Blue
Color.from_value(3) # => Exception
Returns the enum member that has the given value, or nil
if
no such member exists.
Color.from_value?(0) # => Color::Red
Color.from_value?(1) # => Color::Green
Color.from_value?(2) # => Color::Blue
Color.from_value?(3) # => nil
Returns the enum member that has the given name, or
raises ArgumentError
if no such member exists. The comparison is made by using
String#camelcase
and String#downcase
between string and
the enum members names, so a member named "FourtyTwo" or "FOURTY_TWO"
is found with any of these strings: "fourty_two", "FourtyTwo", "FOURTY_TWO",
"FOURTYTWO", "fourtytwo".
Color.parse("Red") # => Color::Red
Color.parse("BLUE") # => Color::Blue
Color.parse("Yellow") # => Exception
Returns the enum member that has the given name, or
nil
if no such member exists. The comparison is made by using
String#camelcase
and String#downcase
between string and
the enum members names, so a member named "FourtyTwo" or "FOURTY_TWO"
is found with any of these strings: "fourty_two", "FourtyTwo", "FOURTY_TWO",
"FOURTYTWO", "fourtytwo".
Color.parse?("Red") # => Color::Red
Color.parse?("BLUE") # => Color::Blue
Color.parse?("Yellow") # => nil
Returns all enum members as an Array(self)
.
Color.values # => [Color::Red, Color::Green, Color::Blue]
Instance Method Detail
Returns the enum member that results from applying a logical "and" operation between this enum member's value and other. This is mostly useful with flag enums.
(IOMode::Read | IOMode::Async) & IOMode::Read # => IOMode::Read
Returns the enum member that results from adding other to this enum member's value.
Color::Red + 1 # => Color::Blue
Color::Red + 2 # => Color::Green
Color::Red + 3 # => 3
Returns the enum member that results from subtracting other to this enum member's value.
Color::Blue - 1 # => Color::Green
Color::Blue - 2 # => Color::Red
Color::Blue - 3 # => -1
Compares this enum member against another, according to their underlying value.
Color::Red <=> Color::Blue # => -1
Color::Blue <=> Color::Red # => 1
Color::Blue <=> Color::Blue # => 0
Returns true
if this enum member and other have the same underlying value.
Color::Red == Color::Red # => true
Color::Red == Color::Blue # => false
Returns the enum member that results from applying a logical "xor" operation between this enum member's value and other. This is mostly useful with flag enums.
Returns true
if this enum member's value includes other. This
performs a logical "and" between this enum member's value and other's,
so instead of writing:
(member & value) != 0
you can write:
member.includes?(value)
The above is mostly useful with flag enums.
For example:
mode = IOMode::Read | IOMode::Write
mode.includes?(IOMode::Read) # => true
mode.includes?(IOMode::Async) # => false
Returns the value of this enum member as an Int32
.
Color::Blue.to_i # => 2
(IOMode::Read | IOMode::Write).to_i # => 3
Color.new(10).to_i # => 10
Returns a String representation of this enum member. In the case of regular enums, this is just the name of the member. In the case of flag enums, it's the names joined by commas, or "None", if the value is zero.
If an enum's value doesn't match a member's value, the raw value is returned as a string.
Color::Red.to_s # => "Red"
IOMode::None.to_s # => "None"
(IOMode::Read | IOMode::Write).to_s # => "Read, Write"
Color.new(10).to_s # => "10"
Appends a String representation of this enum member to the given IO. See #to_s
.
Returns the enum member that results from applying a logical "or" operation between this enum member's value and other. This is mostly useful with flag enums.
(IOMode::Read | IOMode::Async) # => IOMode::Read | IOMode::Async
Returns the enum member that results from applying a logical "not" operation of this enum member's value.