Enums
A set of values that a variable of that type can take. Useful when there are
three values or more, so a Bool doesn’t make sense.
DoorState: enum {
OPEN
CLOSED
UNKNOWN
}
One can think of enum values as static members. Enums have their own types.
state: DoorState
state = DoorState OPEN
// or, simply
state := DoorState OPEN
match state {
case DoorState OPEN =>
"It's open!"
case DoorState CLOSED =>
"It's closed."
case => "Who knows..."
} println()
More example code:
isOpen?: func (state: DoorState) -> Bool {
state == DoorState OPEN
}
Members
Enums can’t have members - they are just values without any added metadata.
Methods
Enums, however, can have methods:
DoorState: enum {
OPEN
CLOSED
UNKNOWN
chance: func -> Float {
match this {
case This OPEN => 1.0
case This CLOSED => 0.0
case => 0.5
}
}
random: static func -> Float {
Random randInt(0, 3) as This
}
}
They can be used like regular objects:
state := DoorState random()
"Generated a random door." println()
"Chance we're passing through = %.2f" printfln(state chance())
Backing type
By defaults, enums are backed by ints. That’s why they can be cast to
Int, and vice versa.
Custom values
Custom values are specified with the assignment operator:
Number: enum {
ONE
TWO
FOUR = 4
FIVE
}
Values are computed like this:
- the first value is
increment(0)if unspecified - every value after that is
increment(previousValue) - by default, the increment is
+1
Read below for more on increments
Custom increment
Custom increments can be specified after the enum keyword:
Odds: enum (+2) {
ONE = 1
THREE
FIVE
SEVEN
NINE
}
Multiplication increments are valid as well:
Powers: enum (*2) {
ONE = 1
TWO
FOUR
EIGHT
SIXTEEN
}
And multiplication increments are actually quite handy for things like bitsets.
Aliasing
When writing bindings for a C api that uses various integer constants as enums, one can map them to ooc this way:
ShutdownParam: enum {
read: extern(SHUT_RD)
write: extern(SHUT_WR)
readWrite: extern(SHUT_RDWR)
}
Then pass them as parameters using ShutdownParam read instead of C’s
short-form. Using the enum’s name in function signatures also allows additional
type checking (that C compilers don’t do, since for them, enum values are just
ints).