script length concatenating string lua multiline literals

string - length - Cómo romper una gran cadena de lua en pequeñas



lua string concat (5)

¿Has probado la función string.sub (s, i [, j])? Puede que quiera mirar aquí:

http://lua-users.org/wiki/StringLibraryTutorial

Tengo una cadena grande (una imagen codificada en base64) y tiene 1050 caracteres de longitud. ¿Cómo puedo agregar una gran cadena formada por pequeñas, como esta en C

function GetIcon() return "Bigggg string 1"/ "continuation of string"/ "continuation of string"/ "End of string"


Esta:

return "Bigggg string 1"/ "continuation of string"/ "continuation of string"/ "End of string"

La sintaxis C / C ++ hace que el compilador lo vea todo como una cadena grande. Generalmente se usa para legibilidad.

El equivalente de Lua sería:

return "Bigggg string 1" .. "continuation of string" .. "continuation of string" .. "End of string"

Tenga en cuenta que la sintaxis C / C ++ es en tiempo de compilación, mientras que el equivalente Lua probablemente hace la concatenación en el tiempo de ejecución (aunque el compilador podría optimizarlo teóricamente). Sin embargo, no debería ser un gran problema.


Puse todos los trozos en una tabla y uso table.concat en él. Esto evita la creación de nuevas cadenas en cada concatenación. por ejemplo (sin contar gastos generales para cadenas en Lua):

-- bytes used foo="1234".. -- 4 = 4 "4567".. -- 4 + 4 + 8 = 16 "89ab" -- 16 + 4 + 12 = 32 -- | | | /_ grand total after concatenation on last line -- | | /_ second operand of concatenation -- | /_ first operand of concatenation -- /_ total size used until last concatenation

Como puede ver, esto explota bastante rápido. Es mejor:

foo=table.concat{ "1234", "4567", "89ab"}

Lo que tomará aproximadamente 3 * 4 + 12 = 24 bytes.


La mayoría de las respuestas aquí resuelven este problema en tiempo de ejecución y no en tiempo de compilación.

Lua 5.2 introduce la secuencia de escape /z para resolver este problema elegantemente sin incurrir en ningún gasto de tiempo de ejecución.

> print "This is a long /z >> string with /z >> breaks in between, /z >> and is spanning multiple lines /z >> but still is a single string only!" This is a long string with breaks in between, and is spanning multiple lines but still is a single string only!

/z omite todos los caracteres siguientes en la cadena hasta el primer carácter que no sea espacio. Esto también funciona para textos literales no multilínea.

> print "This is a simple /z string" This is a simple string

De Lua 5.2 Manual de referencia

La secuencia de escape ''/ z'' omite el siguiente intervalo de caracteres de espacios en blanco, incluidos los saltos de línea; es particularmente útil para dividir e insertar una cadena literal larga en varias líneas sin agregar líneas nuevas y espacios en el contenido de la cadena.


De acuerdo con la programación en Lua 2.4 Strings :

Podemos delimitar cadenas literales también haciendo coincidir dobles corchetes [[...]]. Los literales en esta forma entre corchetes pueden ejecutarse en varias líneas, pueden anidar y no interpretan secuencias de escape. Además, esta forma ignora el primer carácter de la cadena cuando este personaje es una nueva línea. Esta forma es especialmente conveniente para escribir cadenas que contienen partes del programa; por ejemplo,

page = [[ <HTML> <HEAD> <TITLE>An HTML Page</TITLE> </HEAD> <BODY> <A HREF="http://www.lua.org">Lua</A> [[a text between double brackets]] </BODY> </HTML> ]]

Esto es lo más parecido a lo que está pidiendo, pero utilizando el método anterior mantiene las líneas nuevas incrustadas en la cadena, por lo que esto no funcionará directamente.

También puede hacer esto con la concatenación de cadenas (usando ..):

value = "long text that" .. " I want to carry over" .. "onto multiple lines"