Pregunta

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 siguientes ejemplos?

Ejemplos de otros idiomas:

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

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

Gracias de antemano por su ayuda.

¿Fue útil?

Solución

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

Tu ejemplo simple 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 de una sola cadena tengan un rendimiento muy bajo.

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 a concatenar en una matriz t , la rutina de la biblioteca estándar table.concat se puede usar para concatenarlas todas (junto con una cadena separadora entre cada par) sin copiar cadenas innecesarias.

Actualización: Me di cuenta de que originalmente escribí el fragmento de código anterior utilizando pairs () en lugar de ipairs () .

Como se escribió originalmente, la función listvalues ??() producirá 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 intervalo de 1 a #s . Eso es lo que hace pairs () : produce cada par (clave, valor) almacenado en la tabla.

En la mayoría de los casos en los que usarías algo como listvaluas () , estarías interesado en conservar su orden. Por lo tanto, una llamada escrita como listvalues ??{13, 42, 17, 4} producirá una cadena que contiene esos valores en ese orden. Sin embargo, pairs () no lo hará, los detallará en algún orden que depende de la implementación subyacente de la estructura de datos de la tabla. Se sabe que el orden no solo depende de las claves, sino también del orden en que se insertaron y se eliminaron otras claves.

Por supuesto, ipairs () tampoco es una respuesta perfecta. Solo enumera los valores de la tabla que forman una " secuencia " ;. Es decir, esos valores, cuyas claves forman un bloque ininterrumpido que abarca desde 1 hasta algún límite superior, que es (generalmente) también el valor devuelto por el operador # . (En muchos casos, la función ipairs () en sí misma se reemplaza por un simple para que solo cuenta desde 1 a # s . Esta es la práctica recomendada en Lua 5.2 y en LuaJIT donde el bucle más simple para se puede implementar de manera más eficiente que el iterador ipairs () .)

Si pairs () realmente es el enfoque correcto, generalmente es el caso que desea imprimir tanto la clave como el valor. Esto reduce las preocupaciones sobre el orden al hacer que los datos se autodescriban. Por supuesto, como cualquier tipo de Lua (excepto nil y el punto flotante NaN ) se pueden usar como una clave (y NaN también se pueden almacenar como un valor) encontrar una representación de cadena se deja como un ejercicio para el estudiante. Y no te olvides de los árboles y las estructuras de tablas más complejas.

Otros consejos

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

Concatenación:

  

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

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

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

esto es lo mismo para las variables que creo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top