Bloques etiquetados
Un bloque etiquetado (labelled block) no es una estructura de decisión como tal: es un bloque de código del que podemos devolver valores, como si fuera una expresión, y así nos permite asignar resultados a variables o constantes.
const (o var) identificador = nombre_etiqueta: {
< código dentro del bloque >
break :nombre_etiqueta valor_devuelto;
} ;
Las etiquetas de los bloques se definen con un nombre (identificador) seguido de dos puntos, sin espacio entre ambos. El nombre debe de seguir las reglas habituales de denominación de identificadores en Zig. Es recomendable, pero no obligatorio, que este nombre de etiqueta tenga sentido: esto hará que las futuras revisiones de código sean más legibles.
Cuando devolvemos un valor desde un bloque etiquetado, usamos la palabra clave break, seguida de un espacio, dos puntos y el nombre de la etiqueta previamente definida.
Como ejemplo de uso, vamos a devolver una simple respuesta desde un bloque etiquetado:
labelled_response.zig |
|
const std = @import("std"); const print = std.debug.print; pub fn main() void { const n_x = important_label: { break :important_label 42; // devolvemos 42 que se asigna a n_x }; print("Respuesta a la pregunta fundamental sobre la vida, el universo y todo lo demás: {d}\n", .{n_x}); } |
|
$ zig run labelled_response.zig |
|
Respuesta a la pregunta fundamental sobre la vida, el universo y todo lo demás: 42 |
Al igual que en los if/else que devuelven valores, aquí asignamos un resultado a una constante. n_x al ser una constante es inmutable, lo cual ayuda a reducir posibles bugs.
La lógica contenida dentro de un bloque etiquetado puede ser mucho más compleja que la del ejemplo. Obviamente, siempre hay que intentar mantenerla lo más clara posible, segmentando el código en partes más pequeñas y comprensibles para aumentar la claridad del mismo.
Un bloque vacío devuelve void:
empty_block.zig |
|
const std = @import("std"); const print = std.debug.print; pub fn main() void { const n_x = {}; print("Vacío: {} \n", .{n_x}); } |
|
$ zig run empty_block.zig |
|
Vacío: void |
Mientras no estén anidadas, las etiquetas pueden tener el mismo nombre.