Salto a una etiqueta

En el capítulo “2. Decisiones” hemos hablado sobre las etiquetas, bloques etiquetados e incluso sobre  los switch etiquetados. Por si no te acuerdas, si etiquetamos un switch con un nombre simbólico, en este caso bucle:, podremos volver a evaluar el switch etiquetado con un valor nuevo. Esto lo hacemos usando continue :etiqueta valor

label_jump.zig

const std = @import("std");

const print = std.debug.print;

// solo imprime la cabecera

fn print_header() void {

    print("\n", .{});

    print("  ╔════════════════════════════╗\n", .{});

    print("  ║         HIGH SCORES        ║\n", .{});

    print("  ║____________________________║\n", .{});

}

// solo imprime el pie de la tabla

fn print_footer() void {

    print("  ╚════════════════════════════╝\n", .{});

}

const N_MAX_SCORE = 10000;

pub fn main() void {

    const a_scores = [_]u16{ 9000, 8000, 5000, 4200, 3800 };

    print_header();

    // inicializamos el índice a la primera posición

    var n_i: u8 = 0;

    bucle: switch (a_scores[n_i]) {

        // en esta rama consideramos todos los casos de score:

        0...N_MAX_SCORE => |n_x| {

            // imprimimos el índice y el score

            print("  ║ {}º |       {}   pts      ║\n", .{ n_i + 1, n_x });

            // si el índice es más pequeño que la longitud del array

            if (n_i < a_scores.len - 1) {

                // incrementamos el índice para la próxima iteración

                n_i += 1;

                // saltamos a la etiqueta del switch con el score apuntado

                continue :bucle a_scores[n_i];

            }

            // si el índice supera las posiciones del array salimos

        },

        // si las puntuaciones fueran más altas que N_MAX_SCORE

        // salimos -> es imposible nos están engañando

        else => unreachable,

    }

    print_footer();

}

$ zig run label_jump.zig

  ╔════════════════════════════╗

  ║         HIGH SCORES        ║

  ║____________________________║

  ║ 1º |       9000   pts      ║

  ║ 2º |       8000   pts      ║

  ║ 3º |       5000   pts      ║

  ║ 4º |       4200   pts      ║

  ║ 5º |       3800   pts      ║

  ╚════════════════════════════╝

Las funciones print_header y print_footer, son unas funciones auxiliares que imprimen la cabecera y el final de la tabla. Las hemos usado para que el código quede más limpio.

La parte realmente importante, aparte del switch etiquetado es cuando declaramos:

 var n_i: u8 = 0;

Esto es una variable que inicializamos a 0 (la primera posición) para manejar el índice del array a_scores. Antes, en el ejemplo linear_scores_2.zig, incrementábamos “manualmente”  la variable n_i, entre impresión e impresión, cada vez que queríamos acceder a la siguiente posición del array. Ahora lo hacemos dentro del bucle de forma automática:

 // si el índice es más pequeño que la longitud del array

 if (n_i < a_scores.len - 1) {

     // incrementamos el índice para la próxima iteración

     n_i += 1;

     // saltamos a la etiqueta del switch con el score apuntado

     continue :bucle a_scores[n_i];

 }

Comprobamos que n_i no haya superado el máximo índice del array (.len - 1). Si no lo ha hecho, incrementamos la variable y saltamos a la etiqueta bucle: usando continue :bucle y pasando el valor  de la posición siguiente.

Si, en cambio, n_i ya apuntaba a la última posición del array, salimos del bucle e imprimimos el pie de la tabla con la llamada a print_footer.

Bucles
Funciones recursivas
© 2025 Zen of Zig