Una variable en Zig es un nombre asociado a un valor con tipo y mutabilidad explícitos. Si vienes de JavaScript, Python o incluso de C, la gestión de variables en Zig puede parecer estricta al principio.
Esa rigidez nos obliga a expresar si un valor podrá cambiar desde el momento en que lo declaramos.
En Zig, no declaramos una variable y luego “ya veremos” si cambia o no. El lenguaje nos obliga a tomar una decisión de diseño al escribir la línea: ¿este valor va a cambiar?
Esta simple pregunta, respondida miles de veces a lo largo de un proyecto, elimina una categoría entera de bugs relacionados con cambios de estado inesperados.
Sintaxis de declaración
La estructura básica para declarar cualquier dato en Zig sigue siempre este patrón:
palabra_clave nombre: tipo = valor;- palabra_clave: puede ser
constovar. - nombre: el identificador de la variable (en
snake_casepor convención). - tipo: El tipo de dato (
i32,u8,bool, etc.). - valor: El valor inicial.
En Zig, siempre debes inicializar una variable. No existe el concepto de “declarar ahora y definir después” dejando la memoria sucia por defecto (como en C). Si no tienes un valor, debes usar undefined explícitamente.
Constantes: const
En Zig, const es la opción por defecto. Úsala salvo que necesites modificar el valor.
Una variable const es inmutable. Una vez asignada, su valor no puede cambiar nunca durante su ámbito de vida.
const max_vidas: i32 = 5;
const nombre_juego: []const u8 = "Super Zig Bros";
// Esto daría un ERROR de compilación:
// max_vidas = 6; ¿Por qué preferir const?
- Legibilidad: Si estás leyendo código ajeno y ves
const, tu cerebro descansa. Sabes que ese valor es fiable y no va a cambiar por debajo cinco líneas más abajo. - Optimización: El compilador puede realizar optimizaciones agresivas si sabe que un valor nunca cambia.
Variables: var
Usamos var solo cuando tenemos la intención explícita de modificar el valor. Por ejemplo, en contadores, acumuladores o estados que evolucionan.
var contador: i32 = 0;
contador += 1; // Esto es válidoInferencia de tipos
Zig es un lenguaje de tipado estático (los tipos se fijan al compilar), pero tiene inferencia de tipos. Esto significa que, si el contexto es claro, podemos omitir el tipo y dejar que el compilador lo deduzca.
const numero = 42; // El literal conserva el tipo comptime_int
var salud: i32 = 100;
salud -= 1;Aunque la inferencia es cómoda, conviene ser explícito con los tipos cuando el contexto no los deja claros. En las firmas de funciones, Zig exige indicar los tipos de los parámetros y del retorno.
El concepto de undefined
¿Qué ocurre si queremos declarar una variable (quizás un array grande) sin gastar tiempo en rellenarla de ceros porque vamos a escribir todos sus datos inmediatamente después?
En C basta con declarar int a;, cuyo valor queda indeterminado. En Zig debes expresar esa intención mediante undefined.
var buffer: [100]u8 = undefined;Con undefined, le estamos diciendo al compilador: “Sé que esta variable tiene basura ahora mismo. Prometo no leerla hasta que haya escrito algo en ella”.
Usar undefined evita una inicialización innecesaria, pero leer el valor antes de escribirlo es comportamiento ilegal. En modo Debug, Zig puede rellenar esa memoria con el patrón 0xAA, lo que ayuda a detectar el error durante el desarrollo.
La regla de la variable no usada
Esta es la característica que más frustra a los principiantes.
Si declaras una variable en Zig y no la usas, el programa no compila.
pub fn main() void {
const x: i32 = 50;
// Error: unused local constant 'x'
std.debug.print("Hola", .{});
}¿Por qué es tan estricto? Porque una variable no usada suele ser síntoma de:
- Un bug: Calculaste algo pero olvidaste usar el resultado.
- Código muerto: Estás ensuciando el código con cosas innecesarias.
Cómo silenciar el error
Si realmente necesitas declarar algo y no usarlo (por ejemplo, recibes un parámetro que no te sirve), puedes asignarlo a un guion bajo _:
const valor_ignorado = 10;
_ = valor_ignorado; // "Usamos" la variable descartándolaSombreado (shadowing) prohibido
Muchos lenguajes permiten declarar una variable con el mismo nombre que otra que está en un ámbito superior.
// JavaScript (permitido)
let x = 10;
{
let x = 5; // Oculta la x de arriba
}En Zig, esto es un error de compilación.
// Zig
const x: i32 = 10;
{
const x: i32 = 5; // Error: redeclaration of local constant 'x'
}Zig prohíbe el shadowing porque hace que el código sea difícil de leer. Si ves x en la línea 50, no deberías tener que escanear hacia arriba para ver “cuál de las tres x” es la que está activa. Un nombre único para cada cosa.