2009-09-10 24 views
31

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?Concatenación de cadenas en Lua

Los ejemplos de otros idiomas:

===== PERL ===== 
$filename = "checkbook"; 
$filename .= ".tmp"; 
================ 

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

Gracias de antemano por su ayuda.

Respuesta

62

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.

1

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

esto es lo mismo para las variables creo

6

concatenación:

El operador de concatenación de cadenas en Lua se denota por dos puntos ('..'). Si ambos operandos son cadenas o números, entonces se convierten en 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

15

Si se preguntan si hay versión abreviada del operador .. - no no lo hay. No puede escribir a ..= b. Tendrá que escribirlo en su totalidad: filename = filename .. ".tmp"

Cuestiones relacionadas