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.

Edita esta pagina Última actualización: 5/15/2024 por Vital