Arrays mutables
Hasta ahora hemos trabajado con arrays inmutables, que, una vez declarados, ya no se pueden cambiar. Trabajar con constantes (datos inmutables) tiene sus beneficios pero a veces necesitarás usar datos que sí pueden cambiar durante la ejecución del programa.
En el siguiente ejemplo declaramos el array a_nums como variable, para poder cambiar sus elementos también después de declararlos:
array_mutable.zig |
|
const std = @import("std"); const print = std.debug.print; pub fn main() void { var a_nums = [_]u16{ 8, 5, 10, 6, 12 }; print("a_nums es:\n\t {any}\n", .{a_nums}); // cambiamos el primer elemento a su valor + 1 a_nums[0] = a_nums[0] + 1; // cambiamos el cuarto elemento (índice 3) a_nums[3] = 0; print("Después del cambio a_nums es: \n\t {any}\n", .{a_nums}); } |
|
$ zig run array_mutable.zig |
|
a_nums es: { 8, 5, 10, 6, 12 } Después del cambio a_nums es: { 9, 5, 10, 0, 12 } |
Hemos cambiado el valor de dos elementos del array:
- El primer elemento ha sido incrementado en 1,
- El cuarto elemento ha sido asignado al valor 0.
Para ilustrar los cambios que hemos hecho te pongo a continuación un esquema secuencial:
a_nums cuando lo declaramos:
|
Después del primer cambio:
|
Después del segundo cambio:
|
En los primeros ejemplos, habíamos declarado arrays como constantes, no se podía cambiar ningún valor. En este caso a_nums es un array mutable: podemos cambiar sus valores. Pero… ¿podemos añadir un valor más después del último índice (4)? Por ejemplo así:
|
a_nums[5] = 11; |
|
error: index 5 outside array of length 5 a_nums[5] = 11; |
No. No se pueden añadir los valores a un array. El número de elementos de un array es fijo, sea constante o variable. Lo único que puedes cambiar en un array mutable son los valores de los elementos existentes, no la longitud.
Más adelante, veremos que en Zig, hay unas estructuras dinámicas llamadas ArrayList, que sí permiten cambiar la longitud de la estructura. Los arrays, sin embargo, son muy útiles y eficientes para almacenar secuencias datos de longitud fija.
Ejemplos de datos ideales para almacenar en un array
- Días de la semana: siempre son 7,
- Colores RGB: son 3 valores u8 que representan los componentes Rojo, Verde y Azul de un píxel.
- PIN de seguridad típico: 4 dígitos,
- Punto 2D: 2 valores, (x, y)
- Punto 3D: 3 valores, (x,y,z)
- Fichero de mediciones: si contiene siempre un mismo número fijo de columnas (por ejemplo 4 sensores en cada fila).
Seguro que te encontrarás muchos más si piensas en ello.