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.