Tuplas y texto
Ahora después de ver los tipos básicos, quizá te habías preguntado por un detalle del fichero hello_user.zig: ¿Qué es ese símbolo .{} que aparece en la llamada a la función print?
|
std.debug.print("\nHola, usuario.\n", .{}); |
Eso es una estructura de datos que se llama tupla. En concreto, .{} es una tupla vacía.
La función print espera que como el segundo argumento le pasemos una tupla. No tiene porque ser vacía. Una tupla es una estructura de datos sencilla que incluso puede contener varios valores a la vez. Podríamos tener algo así con un valor:
hello_user_2.zig |
|
const std = @import("std"); pub fn main() void { const s_name = "Programador"; std.debug.print( \\Hola, {s}, \\Te estaba esperando. \\ , .{s_name}); } |
|
$ zig run hello_user_2.zig |
|
Hola, Programador. Te estaba esperando. |
Puedes poner tu nombre como valor de la cadena s_name en vez de “Programador”.
Esta vez la cadena que hemos puesto va precedida por la doble barra inclinada: \\ y tiene varias líneas. Esto quiere decir que es una cadena multilínea y por lo tanto los saltos de línea van implícitos con cada nueva línea escrita.
Como ves, la cadena \\Hola, {s}, ahora además contiene un {s}. Este símbolo indica que se va a insertar un dato tipo desde la tupla.
{s} significa que ese dato es una cadena de texto (s viene de string). Si ese dato fuera un número no podríamos poner {s} como indicador de inserción, tendríamos que poner otra letra, por ejemplo {d} (aquí la d es de decimal).
Podríamos también pasar más datos en la tupla:
hello_user_3.zig |
|
const std = @import("std"); pub fn main() void { const s_name = "Programador"; const n_age = 20; std.debug.print("\nHola, {s}.\nTienes {b} años.\n", .{ s_name, n_age }); } |
|
$ zig run hello_user_3.zig |
|
Hola, Programador. Tienes 10100 años. |
¿10100 años?
¿Por qué tenemos esa salida si n_age tiene el valor 20? Tómate tu tiempo para pensarlo.
Fíjate que tenemos un indicador de inserción {b}. ¿Qué podría significar esa b para que 20 pase a ser 10100?
Formatos de datos en una cadena
Aquí tienes una tabla de estos indicadores para que te orientes:
|
{s} |
Cadena de texto: “Hola”, “Programador” |
|
{d} |
Número impreso en formato decimal: 1, 3, 42, 23 etc |
|
{b} |
El número será impreso en binario: 0001, 0010… |
|
{x} |
El número será impreso en hexadecimal en minúsculas: 255 como ff |
|
{X} |
El número es impreso en hexadecimal en mayúsculas: 255 como FF |
|
{c} |
Un carácter (como un u8 interpretado como ASCII): 69 es ‘a’ |
|
{} |
Zig intenta detectar el tipo |
Como habrás podido concluir {b} quiere decir que el número que le pasamos en la tupla será impreso en formato binario en la cadena.
Si ponemos {} o {d} el resultado nos devolverá el formato decimal al que estamos acostumbrados:
hello_user_4.zig |
|
const std = @import("std"); pub fn main() void { const s_name = "Programador"; const n_age = 20; std.debug.print("\nHola, {s}.\nTienes {d} años.\n", .{ s_name, n_age }); } |
|
$ zig run hello_user_4.zig |
|
Hola, Programador. Tienes 20 años. |