enum
Shell
1/7 test "enum ordinal value"... OK
2/7 test "set enum ordinal value"... OK
3/7 test "enum method"... OK
4/7 test "enum variant switch"... OK
5/7 test "std.meta.Tag"... OK
6/7 test "@typeInfo"... OK
7/7 test "@tagName"... OK
All 7 tests passed.
See also:
By default, enums are not guaranteed to be compatible with the C ABI:
test.zig
export fn entry(foo: Foo) void { _ = foo; }
For a C-ABI-compatible enum, provide an explicit tag type to the enum:
test.zig
const Foo = enum(c_int) { a, b, c };
export fn entry(foo: Foo) void { _ = foo; }
Shell
$ zig build-obj test.zig
Enum literals allow specifying the name of an enum field without specifying the enum type:
Shell
1/2 test "enum literals"... OK
2/2 test "switch using enum literals"... OK
All 2 tests passed.
A Non-exhaustive enum can be created by adding a trailing ‘_‘ field. It must specify a tag type and cannot consume every enumeration value.
@intToEnum on a non-exhaustive enum involves the safety semantics of to the integer tag type, but beyond that always results in a well-defined enum value.
A switch on a non-exhaustive enum can include a ‘_‘ prong as an alternative to an else
prong with the difference being that it makes it a compile error if all the known tag names are not handled by the switch.
const std = @import("std");
const expect = std.testing.expect;
const Number = enum(u8) {
one,
two,
three,
};
test "switch on non-exhaustive enum" {
const number = Number.one;
const result = switch (number) {
.one => true,
.two,
.three => false,
_ => false,
};
try expect(result);
const is_one = switch (number) {
.one => true,
else => false,
};
}
Shell