variable statements language define declaracion lua concatenation

statements - Concatenación de cuerdas en Lua



lua if statements (4)

En muchos idiomas, puede concatenar cadenas en la asignación de variables. Tengo un escenario, usando el lenguaje de programación Lua, donde necesito agregar la salida de un comando a una variable existente. ¿Existe un equivalente funcional en Lua para los ejemplos a continuación?

Ejemplos de otros idiomas:

===== PERL ===== $filename = "checkbook"; $filename .= ".tmp"; ================ ===== C# ===== string filename = "checkbook"; filename += ".tmp"; ===============

Gracias de antemano por su ayuda.


Concatenación:

El operador de concatenación de cadenas en Lua se denota mediante dos puntos (''..''). Si ambos operandos son cadenas o números, entonces se convierten a cadenas de acuerdo con las reglas mencionadas en el §2.2.1. De lo contrario, se llama al meta-método "concat" (ver §2.8).

de: http://www.lua.org/manual/5.1/manual.html#2.5.4


Las cadenas se pueden unir utilizando el operador de concatenación ".."

esto es lo mismo para las variables que pienso


Si está preguntando si hay una versión abreviada del operador .. - no, no. No puedes escribir a ..= b . Tendrá que escribirlo en su totalidad: filename = filename .. ".tmp"


Como han dicho otras respuestas, el operador de concatenación de cadenas en Lua tiene dos puntos.

Su ejemplo simple se escribiría así:

filename = "checkbook" filename = filename .. ".tmp"

Sin embargo, hay una advertencia que debes 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 idioma 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

Al recopilar las cadenas que se concatenarán en una matriz t , se puede usar la rutina de la biblioteca estándar table.concat para concatenarlas todas (junto con una cadena de separación entre cada par) sin copia innecesaria de cadenas.

Actualización: Me acabo de dar cuenta de que originalmente escribí el fragmento de código anterior usando pairs() lugar de ipairs() .

Como se escribió originalmente, la función listvalues() hecho produciría cada valor 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 preservar su orden. Entonces una llamada escrita como listvalues{13, 42, 17, 4} produciría una cadena que contiene ese valor en ese orden. Sin embargo, los pairs() no harán 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 (generalmente) también el valor devuelto por el operador # . (En muchos casos, la función ipairs() sí misma es mejor reemplazada por un ciclo más simple que cuenta de 1 a #s . Esta es la práctica recomendada en Lua 5.2 y en LuaJIT donde el ciclo más simple se puede implementar de manera más eficiente que el iterador ipairs() )

Si los pairs() realmente son el enfoque correcto, generalmente es el caso en el 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 NaN punto flotante) se puede usar como clave (y NaN también se puede almacenar como un 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.