Skip to content

Enums

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.

4 collapsed lines
const expect = @import("std").testing.expect;
const Value = enum(u2) { zero, one, two };
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.

2 collapsed lines
const expect = @import("std").testing.expect;
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.

2 collapsed lines
const expect = @import("std").testing.expect;
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.

2 collapsed lines
const expect = @import("std").testing.expect;
const Mode = enum {
var count: u32 = 0;
on,
off,
};
test "hmm" {
Mode.count += 1;
try expect(Mode.count == 1);
}