“Para cada” bucle en una tabla lua con pares de valores clave
lua-5.2 (1)
Digamos que tengo una tabla definida así:
myTable = { myValue = nil, myOtherValue = nil}
¿Cómo iteraré a través de él en un bucle de moda como este?
for key,value in myTable do --pseudocode
value = "foobar"
end
Además, si ayuda, realmente no me importa la clave, solo el valor.
Las claves que no tienen valor (es decir, son nil
) no existen. myTable
es una tabla vacía en lo que respecta a Lua.
Puedes recorrer una tabla vacía, pero eso no va a ser útil.
Además:
for key,value in myTable do --pseudocode
value = "foobar"
end
Este "pseudocódigo" no tiene sentido. No puede modificar una tabla modificando el contenido de una variable local; Lua no funciona de esa manera. No puede obtener una referencia a una entrada de tabla; Solo puedes obtener un valor de la tabla.
Si desea modificar el contenido de una tabla, tiene que modificar la tabla . Por ejemplo:
for key,value in pairs(myTable) do --actualcode
myTable[key] = "foobar"
end
Note el uso de myTable
. No puede modificar una tabla sin usar la tabla en algún momento. Tanto si se trata de la tabla a la que se accede a través de myTable
como a través de alguna otra variable, se almacena una referencia a la tabla en.
En general, la modificación de una tabla mientras se itera a través de ella puede causar problemas. Sin embargo, Lua dice:
El comportamiento de
next
no está definido si, durante el recorrido, asigna cualquier valor a un campo inexistente en la tabla. Sin embargo, puede modificar los campos existentes. En particular, puede borrar los campos existentes.
Entonces es perfectamente válido modificar el valor de un campo que ya existe. Y la key
obviamente ya existe en la tabla, así que puedes modificarla. Incluso puedes configurarlo en nil
sin problemas.
Las variables en Lua no son más que titulares de valores. Las tablas contienen valores; myTable[key]
devuelve un valor. Puede almacenar ese valor en una variable, pero cambiar la variable no cambiará el valor de myTable[key]
. Como las tablas se almacenan por referencia, puede cambiar el contenido de la tabla en una variable y ver los cambios en otra, pero eso es simplemente el contenido de la tabla, no la tabla en sí.