Язык программирования Crystal

enum

An enum declaration inside a lib declares a C enum:

lib X
  # In C:
  #
  #  enum SomeEnum {
  #    Zero,
  #    One,
  #    Two,
  #    Three,
  #  };
  enum SomeEnum
    Zero
    One
    Two
    Three
  end
end

As in C, the first member of the enum has a value of zero and each successive value is incremented by one.

To use a value:

X::SomeEnum::One #=> One

You can specify the value of a member:

lib X
  enum SomeEnum
    Ten = 10
    Twenty = 10 * 2
    ThirtyTwo = 1 << 5
  end
end

As you can see, some basic math is allowed for a member value: +, -, *, /, &, |, <<, >> and %.

The type of an enum member is Int32 by default, even if you specify a different type in a constant value:

lib X
  enum SomeEnum
    A = 1_u32
  end
end

X::SomeEnum #=> 1_i32

However, you can change this default type:

lib X
  enum SomeEnum : Int8
    Zero,
    Two = 2
  end
end

X::SomeEnum::Zero #=> 0_i8
X::SomeEnum::Two  #=> 2_i8

You can use an enum as a type in a fun argument or struct or union members:

lib X
  enum SomeEnum
    One
    Two
  end

  fun some_fun(value : SomeEnum)
end