59 lines
1.6 KiB
Zig
59 lines
1.6 KiB
Zig
const expect = @import("std").testing.expect;
|
|
|
|
// Zig's enums allow you to define types with a restricted set of named values.
|
|
// Let's declare an enum.
|
|
const Direction = enum { north, south, east, west };
|
|
|
|
// Enums types may have specified (integer) tag types.
|
|
const Value = enum(u2) { zero, one, two };
|
|
|
|
// Enum's ordinal values start at 0. They can be accessed with the built-in function `@intFromEnum`.
|
|
test "enum ordinal value" {
|
|
try expect(@intFromEnum(Value.zero) == 0);
|
|
try expect(@intFromEnum(Value.one) == 1);
|
|
try expect(@intFromEnum(Value.two) == 2);
|
|
}
|
|
|
|
// Values can be overridden, with the next values continuing from there.
|
|
const Value2 = enum(u32) {
|
|
hundred = 100,
|
|
thousand = 1000,
|
|
million = 1000000,
|
|
next,
|
|
};
|
|
|
|
test "set enum ordinal value" {
|
|
try expect(@intFromEnum(Value2.hundred) == 100);
|
|
try expect(@intFromEnum(Value2.thousand) == 1000);
|
|
try expect(@intFromEnum(Value2.million) == 1000000);
|
|
try expect(@intFromEnum(Value2.next) == 1000001);
|
|
}
|
|
|
|
// Enums can be given methods. These act as namespaced functions that can be called with the dot syntax.
|
|
const Suit = enum {
|
|
clubs,
|
|
spades,
|
|
diamonds,
|
|
hearts,
|
|
pub fn isClubs(self: Suit) bool {
|
|
return self == Suit.clubs;
|
|
}
|
|
};
|
|
|
|
test "enum method" {
|
|
try expect(Suit.spades.isClubs() == Suit.isClubs(.spades));
|
|
}
|
|
|
|
// Enums can also be given var and const declarations.
|
|
// These act as namespaced globals and their values are unrelated and unattached to instances of the enum type.
|
|
const Mode = enum {
|
|
var count: u32 = 0;
|
|
on,
|
|
off,
|
|
};
|
|
|
|
test "hmm" {
|
|
Mode.count += 1;
|
|
try expect(Mode.count == 1);
|
|
}
|