Un Map almacena pares clave-valor con búsqueda rápida por clave. Los maps se crean con Map.new() y soportan inserción, recuperación, prueba de pertenencia y enumeración de claves.
// Maps: Map.new(), insert, get, has, size, iterar con keys() // bool -> texto: int_to_string() espera un int y un bool no se convierte solo, // así que la conversión se escribe explícita. fn si_no(b: bool) -> String { if b { return "si" } return "no" } fn main() -> int { var capitales: Map = Map.new() // Insertar pares clave-valor capitales.insert("Argentina", "Buenos Aires") capitales.insert("Francia", "Paris") capitales.insert("Japon", "Tokio") // size print("paises: " + int_to_string(capitales.size())) // get let capital: String = capitales.get("Francia") print("Capital de Francia: " + capital) // has print("tiene Argentina: " + si_no(capitales.has("Argentina"))) print("tiene Brasil: " + si_no(capitales.has("Brasil"))) // Iterar claves let ks: Array = capitales.keys() print("claves (" + int_to_string(ks.length()) + "):") for k in ks { // El tipo de elemento de un Array que devuelve un builtin no se infiere: // sin esta anotación, " " + k concatena el puntero, no el texto. let clave: String = k print(" " + clave) } return 0 }
paises: 3 Capital de Francia: Paris tiene Argentina: si tiene Brasil: no claves (3): Francia Japon Argentina
Cómo funciona
Los maps en Nyx se crean con Map.new() — no existe una sintaxis de map literal (sería ambigua con las expresiones de bloque). La receta declara el map con var por convención, pero let sirve igual para insertar: en Nyx let y var gobiernan si el binding puede reasignarse, no si el map al que apunta puede mutarse.
El método .insert(key, value) agrega o actualiza un par clave-valor. .get(key) obtiene el valor de una clave, devolviendo el valor almacenado como String (o el tipo correspondiente). Si la clave no existe el programa entra en panic nombrando la clave; usa .has(key) para comprobarla antes, o .get_or(key, default) para dar un valor por defecto.
.has(key) devuelve un bool, y en Nyx un bool no es un int: pasarlo directo a int_to_string no compila, así que la receta lo lleva a texto con el pequeño helper si_no. .size() devuelve la cantidad de entradas actualmente en el map.
.keys() devuelve un Array con todas las claves del map, y el orden de iteración de un hash map no es el de inserción. Un Array tampoco lleva consigo el tipo de sus elementos, así que el cuerpo del bucle liga cada clave con let clave: String = k antes de imprimirla — sin esa anotación la concatenación emitiría la dirección de la clave en vez de su texto.