Structs

Las estructuras son el tipo de datos compuesto más común en Zig, lo que te permite definir tipos que pueden almacenar un conjunto fijo de campos nombrados. Zig no ofrece garantías sobre el orden en memoria de los campos en una estructura o su tamaño. Al igual que con los arrays, las estructuras también se construyen de forma ordenada con la sintaxis T{}. Aquí tienes un ejemplo de declaración y llenado de una estructura.

const Vec3 = struct { x: f32, y: f32, z: f32 };

test "uso de la estructura" {
    const my_vector = Vec3{
        .x = 0,
        .y = 100,
        .z = 50,
    };
    _ = my_vector;
}

Los campos de las estructuras no pueden quedar implícitamente sin inicializar:

test "campo de estructura faltante" {
    const my_vector = Vec3{
        .x = 0,
        .z = 50,
    };
    _ = my_vector;
}
error: missing field: 'y'
    const my_vector = Vec3{
                        ^

Los campos pueden tener valores predeterminados:

const Vec4 = struct { x: f32 = 0, y: f32 = 0, z: f32 = 0, w: f32 = 0 };

test "valores predeterminados de estructura" {
    const my_vector = Vec4{
        .x = 25,
        .y = -50,
    };
    _ = my_vector;
}

Al igual que las enums, las estructuras también pueden contener funciones y declaraciones.

Las estructuras tienen la propiedad única de que cuando se les proporciona un puntero a una estructura, se realiza automáticamente un nivel de desreferenciación al acceder a los campos. Observa cómo, en este ejemplo, se accede a self.x y self.y en la función swap sin necesidad de desreferenciar el puntero self.

const expect = @import("std").testing.expect;

const Stuff = struct {
    x: i32,
    y: i32,
    fn swap(self: *Stuff) void {
        const tmp = self.x;
        self.x = self.y;
        self.y = tmp;
    }
};

test "desreferenciación automática" {
    var thing = Stuff{ .x = 10, .y = 20 };
    thing.swap();
    try expect(thing.x == 20);
    try expect(thing.y == 10);
}
Edita esta pagina Última actualización: 5/15/2024 por Vital