Enums
Las enums de Zig te permiten definir tipos con un conjunto restringido de valores nombrados.
Vamos a declarar una enum.
const Direction = enum { north, south, east, west };
Los tipos de enums pueden tener tipos de etiqueta especificados (enteros).
const Value = enum(u2) { zero, one, two };
Los valores ordinales de las enums comienzan en 0. Se pueden acceder con la función integrada @intFromEnum.
test "valor ordinal de la enum" {
try expect(@intFromEnum(Value.zero) == 0);
try expect(@intFromEnum(Value.one) == 1);
try expect(@intFromEnum(Value.two) == 2);
}
Los valores pueden ser anulados, con los siguientes valores continuando desde allí.
const Value2 = enum(u32) {
hundred = 100,
thousand = 1000,
million = 1000000,
next,
};
test "establecer valor ordinal de la enum" {
try expect(@intFromEnum(Value2.hundred) == 100);
try expect(@intFromEnum(Value2.thousand) == 1000);
try expect(@intFromEnum(Value2.million) == 1000000);
try expect(@intFromEnum(Value2.next) == 1000001);
}
Las enums pueden tener métodos. Estos actúan como funciones con nombres de espacio que pueden ser llamadas con la sintaxis de punto.
const Suit = enum {
clubs,
spades,
diamonds,
hearts,
pub fn isClubs(self: Suit) bool {
return self == Suit.clubs;
}
};
test "método de la enum" {
try expect(Suit.spades.isClubs() == Suit.isClubs(.spades));
}
Las enums también pueden tener declaraciones var y const. Estas actúan como variables globales con nombres de espacio y sus valores no están relacionados ni adjuntos a instancias del tipo enum.
const Mode = enum {
var count: u32 = 0;
on,
off,
};
test "hmm" {
Mode.count += 1;
try expect(Mode.count == 1);
}