Opaque
Los tipos opaque en Zig tienen un tamaño y alineación desconocidos (aunque no nulos). Debido a esto, estos tipos de datos no pueden ser almacenados directamente. Se utilizan para mantener la seguridad de tipo con punteros a tipos sobre los que no tenemos información.
const Window = opaque {};
const Button = opaque {};
extern fn show_window(*Window) callconv(.C) void;
test "opaque" {
var main_window: *Window = undefined;
show_window(main_window);
var ok_button: *Button = undefined;
show_window(ok_button);
}
./test-c1.zig:653:17: error: expected type '*Window', found '*Button'
show_window(ok_button);
^
./test-c1.zig:653:17: note: pointer type child 'Button' cannot cast into pointer type child 'Window'
show_window(ok_button);
^
Los tipos opaque pueden tener declaraciones en sus definiciones (igual que las estructuras, enumeraciones y uniones).
const Window = opaque {
fn show(self: *Window) void {
show_window(self);
}
};
extern fn show_window(*Window) callconv(.C) void;
test "opaque with declarations" {
var main_window: *Window = undefined;
main_window.show();
}
El caso de uso típico de los tipos opaque es mantener la seguridad de tipo al interoperar con código C que no expone información completa sobre el tipo.