Как разбить большую строку Луа на маленькие - PullRequest
21 голосов
/ 22 июля 2011

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

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

Ответы [ 5 ]

31 голосов
/ 22 июля 2011

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

Мы можем разделять буквенные строки также, сопоставляя двойные квадратные скобки [[...]]. Литералы в этой форме в скобках могут занимать несколько строк, могут быть вложенными и не интерпретировать 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"
15 голосов
/ 18 января 2014

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

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

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

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

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

1: Все escape-последовательности, включая \z, работают только на коротких литеральных строках ("…", '…') и, понятно, не на длинных литеральных строках ([[...]] и т. Д.)

3 голосов
/ 25 июля 2011

Я бы положил все куски в таблицу и использовал 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 байта.

1 голос
/ 22 июля 2011

Вы пробовали функцию string.sub (s, i [, j]).Вы можете посмотреть здесь:

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

0 голосов
/ 23 июля 2011

This:

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

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

Эквивалент Lua будет выглядеть следующим образом:

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

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

...