Cero a Zig 08: Variables

Published: 2024-08-11

Ahora veremos un concepto fundamental: Variables.

Todo el código lo escribiremos en el proyecto que creamos en el artículo anterior.

Motivación

Vamos a plantear un escenario: Queremos escribir un programa que salude a una persona, le diga cuanto cuesta su orden, y se despida.

Digamos que la persona se llama Juan. El código es así:

const std = @import("std");

pub fn main() !void {
    std.debug.print("Hola {s}\n", .{"Juan"}); 
    std.debug.print("Tu pedido cuesta {s} dolares\n", .{"20"});
    std.debug.print("Adios {s}\n", .{"Juan"});
}

Y al ejecutarlo se muestra:

Codigo

Como el código es sencillo, no hay ningún problema. ¿Pero qué pasaría si tuvieramos que imprimir el nombre 10 veces? Entonces tendríamos que repetirlo 10 veces.

const std = @import("std");

pub fn main() !void {
    std.debug.print("Hola {s}\n", .{"Juan"}); 
    std.debug.print("Hola {s}\n", .{"Juan"});
    std.debug.print("Hola {s}\n", .{"Juan"});
    std.debug.print("Hola {s}\n", .{"Juan"});
    std.debug.print("Hola {s}\n", .{"Juan"});
    std.debug.print("Hola {s}\n", .{"Juan"});
    std.debug.print("Hola {s}\n", .{"Juan"});
    std.debug.print("Hola {s}\n", .{"Juan"});
    std.debug.print("Hola {s}\n", .{"Juan"});
    std.debug.print("Hola {s}\n", .{"Juan"});
}

Codigo

Un poco tedioso, pero nada imposible.

Ahora vamos a cambiar el programa: el nombre de la persona será Maria.

Lo que tenemos que hacer es cambiar Juan por Maria en los 10 lugares, uno por uno.

Esto es bastante común, y existe una solución para no cambiar 10 veces, sino solamente una.

Variables

Una variable es como un almacén. Una variable almacena un valor bajo un nombre.

Por ejemplo, podemos decir que nombre = "Juan", y a partir de ese momento cada vez que usemos nombre se reemplazará por Juan.

Por ejemplo:

const std = @import("std"); 

pub fn main() !void {
    const nombre = "Juan"; 
    std.debug.print("Hola {s}\n", .{nombre});
}

En el código de arriba en la linea 4, hemos creado una variable nombre, y le hemos dado como valor "Juan".

Despues, en la linea 5 estamos utilizando la variable. En vez de escribir .{"Juan"} escribimos .{nombre}.

Al ejecutar el programa se imprimirá Hola Juan

Codigo

Podemos utilizar la variable las veces que queramos. Si imprimimos 10 veces se vería así:

const std = @import("std"); 

pub fn main() !void {
    const nombre = "Juan"; 
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
}

Y al ejecutar se imprime 10 veces.

Codigo

Ahora, si queremos cambiar Juan por Maria, solo tenemos que hacerlo en un lugar:

const std = @import("std"); 

pub fn main() !void {
    const nombre = "Maria"; 
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
    std.debug.print("Hola {s}\n", .{nombre});
}

Codigo

Creando una variable

Para crear una variable se escribe:

  • const
  • El nombre de la variable
  • =
  • El valor de la variable
  • ;

Puedes crear varias variables, cada una en una línea. Por ejemplo:

const nombre = "Pedro";
const edad = "32";
const helado_favorito = "Vainilla";

Nombre de la variable

Los nombres de las variables siguen algunas reglas:

  • El nombre inicia con letra minúscula o guión bajo _
  • El nombre despues puede tener letras minúsculas, mayúsculas, números o guiones bajos _.
  • No pueden haber espacios, guiones - u otros.

Por ejemplo, los siguientes nombres son válidos:

_nombre
apellido
nombres_y_apellidos
numeroDeVentas
ratio_fiscal_2

Los siguientes nombres son inválidos:

Nombre              // inicia con N mayuscula
3_gatos             // inicia con un número
nombres y apellidos // tiene espacios
apelido-paterno     // tiene un guión

Error de duplicado

Otro dato importante es que solo se puede crear una variable con un nombre una vez. Por ejemplo:

Codigo

En el código de arriba hay un error. Cuando aparecen lineas punteadas rojas significa que hay un error.

Si colocas tu mouse encima de la palabra subrayada aparecerá un mensaje:

Codigo

El error es redeclaration of local constant 'nombre'. Significa “redeclaración de constante local ‘nombre’“.

Hay algunas palabras raras, pero quiere decir que estas volviendo a crear una variable con un nombre ya ocupado.

Para solucionar el error, cambia el nombre de la variable.

Error con variables no utilizadas

Si creas variables, y no las utilizas despues, tendrás este error:

Codigo

unused local constant: “constante local inutilizada”.

Zig no nos permite crear una variable y dejarla olvidada. Si creamos una variable, la tenemos que usar.

Para solucionar el error, imprime la variable, o elimínala, si no la vas a utilizar aún.

Próximamente

En el siguiente artículo aprenderemos los conceptos: comentarios, números y operaciones matemáticas.

Ejercicios

Resuelve estos ejercicios en tu editor de texto VSCode. Al ejecutar debe salir en el terminal el mismo resultado que el del enunciado.

Tu respuesta no necesita ser exáctamente la misma a la que está aquí, pero debería funcionar.

1: Crea una variable nombre con valor "John", y una variable apellido con valor "Doe". Imprime ambas utilizando formatos.

John Doe

2: Necesito un programa que imprima el siguiente mensaje:

Bienvenido a ACME inc Tu postulación a ACME inc ha sido aceptada. En breve recibirás un correo con el código de conducta de ACME inc

Mi empresa aún no tiene un nombre fijo, así que necesito poder cambiar ACME inc fácilmente después.

3: También necesito un programa que imprima una lista de invitados:

Lista de invitados: Área A de ACME inc: Rosa Área A de ACME inc: María Área A de ACME inc: Andrea Área B de ACME inc: Rodrigo Área B de ACME inc: Pedro Área C de ACME inc: Raul Área C de ACME inc: Ana

Como puedes ver, aun está el nombre provisional ACME inc. Pero también hay nombres provisionales de las áreas de la empresa: Área A, Área B y Área C. Estos nombres eventualmente cambiarán, asi que necesito poder cambiarlos después en un único lugar. Los nombres de las personas no cambiarán.

4: Mis socios y yo nos pusimos de acuerdo. Necesito el programa para imprimir la lista de invitados. El nombre final de la empresa es AXM SAC, y las 3 áreas son (en orden): Administración, Tesorería y Ventas.

La lista debe verse así:

Lista de invitados: Administración de AXM SAC: Rosa Administración de AXM SAC: María Administración de AXM SAC: Andrea Tesorería de AXM SAC: Rodrigo Tesorería de AXM SAC: Pedro Ventas de AXM SAC: Raul Ventas de AXM SAC: Ana