枚举¶
注意
此页面适用于 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 枚举值.