跳转到内容

枚举

注意

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