Como han dicho otras respuestas, el operador de concatenación de cadenas en Lua tiene dos puntos.
Su ejemplo sencillo se escribiría así:
filename = "checkbook"
filename = filename .. ".tmp"
Sin embargo, hay una advertencia a tener en cuenta. Como las cadenas en Lua son inmutables, cada concatenación crea un nuevo objeto de cadena y copia los datos de las cadenas de origen en él. Eso hace que las concatenaciones sucesivas a una sola cadena tengan un rendimiento muy pobre.
El lenguaje Lua para este caso es algo como esto:
function listvalues(s)
local t = { }
for k,v in ipairs(s) do
t[#t+1] = tostring(v)
end
return table.concat(t,"\n")
end
Mediante la recopilación de las cadenas a concatenar en una matriz t
, el estándar de la biblioteca de rutinas table.concat
puede utilizarse para concatenar a todos ellos (junto con una secuencia de separación entre cada par) sin copia innecesaria de cadenas.
Actualización: Acabo de notar que escribí originalmente el fragmento de código anterior utilizando pairs()
en lugar de ipairs()
.
Como se escribió originalmente, la función listvalues()
produciría todos los valores de la tabla pasada, pero no en un orden estable o predecible. Por otro lado, incluiría valores cuyas claves no eran enteros positivos en el lapso de 1
a #s
. Eso es lo que hace pairs()
: produce cada par único (clave, valor) almacenado en la tabla.
En la mayoría de los casos en los que utilizaría algo como listvaluas()
, estaría interesado en conservar su pedido. Entonces, una llamada escrita como listvalues{13, 42, 17, 4}
produciría una cadena que contiene esos valores en ese orden.Sin embargo, pairs()
no hará eso, los detallará en un cierto orden que depende de la implementación subyacente de la estructura de datos de la tabla. Se sabe que la orden no solo depende de las teclas, sino también del orden en que se insertaron las llaves y se quitaron otras.
Por supuesto ipairs()
tampoco es una respuesta perfecta. Solo enumera los valores de la tabla que forman una "secuencia". Es decir, aquellos valores cuyas claves forman un bloque continuo que abarca desde 1 hasta un límite superior, que es (normalmente) también el valor devuelto por el operador #
. (En muchos casos, la función ipairs()
sí está mejor sustituida por una simple for
bucle que acaba cuenta 1
-#s
. Esta es la práctica recomendada en Lua 5.2 y en LuaJIT donde el más simple for
bucle se puede implementar de manera más eficiente que el ipairs()
iterador .)
Si pairs()
es realmente el enfoque correcto, generalmente es el caso que desea imprimir tanto la clave como el valor. Esto reduce las preocupaciones sobre el orden haciendo que los datos se autodescriban. Por supuesto, dado que cualquier tipo de Lua (excepto nil
y el punto flotante NaN
) se puede utilizar como una clave (y NaN
también se puede almacenar como valor) encontrar una representación de cadena se deja como ejercicio para el alumno. Y no te olvides de los árboles y las estructuras más complejas de las tablas.