Подтвердить что ты не робот

Как разбить большую строку lua на маленькие

У меня есть большая строка (образ с кодировкой base64) и длина 1050 символов. Как добавить большую строку, образованную из маленьких, например, в C

 function GetIcon()
    return "Bigggg string 1"\
"continuation of string"\
"continuation of string"\
"End of string"
4b9b3361

Ответ 1

Согласно Программирование в строках Lua 2.4:

Мы можем разграничить литеральные строки также путем сопоставления двойных квадратных скобок [[...]]. Литералы в этой заключенной в квадратные скобки форме могут работать для нескольких строк, могут гнездиться и не интерпретировать escape-последовательности. Более того, эта форма игнорирует первый символ строки, когда этот символ является символом новой строки. Эта форма особенно удобна для записи строк, содержащих фрагменты программы; например,

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>
]]

Это самое близкое к тому, что вы просите, но с использованием вышеописанного метода хранятся новые строки, встроенные в строку, поэтому это не будет работать напрямую.

Вы также можете сделать это с помощью конкатенации строк (используя..):

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

Ответ 2

Большинство ответов здесь решает эту проблему во время выполнения, а не во время компиляции.

Lua 5.2 представляет escape-последовательность \z, чтобы решить эту проблему элегантно, не прибегая к расходам во время выполнения.

> 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 пропускает все последующие символы в строке до первого непространственного символа. Это работает и для текста, не являющегося многострочным литералом.

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

Из Справочное руководство Lua 5.2

Управляющая последовательность '\ z' пропускает следующий пробел символов пробела, включая разрывы строк; особенно полезно разбить и отложить длинную литеральную строку на несколько строк без добавления строк и пробелов в содержимое строки.

Ответ 3

Я бы поставил все куски в таблицу и использовал table.concat. Это позволяет избежать создания новых строк при каждой конкатенации. например (без учета накладных расходов для строк в 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

Как вы можете видеть, это быстро взрывается. Это лучше:

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

Что займет около 3 * 4 + 12 = 24 байта.

Ответ 5

Это:

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

Синтаксис C/С++ заставляет компилятор видеть все как одну большую строку. Он обычно используется для удобства чтения.

эквивалент Lua:

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

Обратите внимание, что синтаксис C/С++ является временем компиляции, тогда как эквивалент Lua, скорее всего, выполняет конкатенацию во время выполнения (хотя компилятор теоретически может его оптимизировать). Однако это не должно быть большой проблемой.