Anonymous Structs

El tipo struct puede omitirse en un literal struct. Estos literales pueden coercer a otros tipos struct.

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

test "struct anonima literal" {
    const Point = struct { x: i32, y: i32 };

    const pt: Point = .{
        .x = 13,
        .y = 67,
    };
    try expect(pt.x == 13);
    try expect(pt.y == 67);
}

Las estructuras anónimas pueden ser completamente anónimas, es decir, sin ser convertidas a otro tipo de estructura.

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

test "estructura completamente anónima" {
    try dump(.{
        .int = @as(u32, 1234),
        .float = @as(f64, 12.34),
        .b = true,
        .s = "hi",
    });
}

fn dump(args: anytype) !void {
    try expect(args.int == 1234);
    try expect(args.float == 12.34);
    try expect(args.b);
    try expect(args.s[0] == 'h');
    try expect(args.s[1] == 'i');
}

Las estructuras anónimas sin nombres de campos pueden ser creadas y se denominan tuplas. Estas tienen muchas de las propiedades de los arrays; las tuplas pueden ser iteradas, indexadas, pueden ser utilizadas con los operadores ++ y **, y tienen un campo len. Internamente, estas tienen nombres de campos numerados comenzando en “0”, los cuales pueden ser accedidos con la sintaxis especial @“0”, que actúa como un escape para la sintaxis - las cosas dentro de @"" siempre se reconocen como identificadores.

Aquí se debe utilizar un bucle en línea para iterar sobre la tupla, ya que el tipo de cada campo de la tupla puede ser diferente.

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

test "tuple" {
    const values = .{
        @as(u32, 1234),
        @as(f64, 12.34),
        true,
        "hi",
    } ++ .{false} ** 2;
    try expect(values[0] == 1234);
    try expect(values[4] == false);
    inline for (values, 0..) |v, i| {
        if (i != 2) continue;
        try expect(v);
    }
    try expect(values.len == 6);
    try expect(values.@"3"[0] == 'h');
}
Edita esta pagina Última actualización: 5/15/2024 por Vital