2011-07-22 16 views
19

Mam duży ciąg (kodowany przez base64) i ma on 1050 znaków. Jak mogę dołączyć duży ciąg utworzony z małych, jak to w CJak przerwać duży łańcuch lua na małe

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

Odpowiedz

24

Według Programming in Lua 2.4 Strings:

Możemy oddzielić dosłowne ciągi także poprzez dopasowanie podwójne nawiasy kwadratowe [[...] ]. Literały w tej postaci w nawiasach kwadratowych mogą przebiegać przez kilka linii, mogą zagnieżdżać się i nie interpretować sekwencji ucieczki. Co więcej, ten formularz ignoruje pierwszy znak ciągu, gdy ten znak jest znakiem nowej linii. Ta forma jest szczególnie dogodna do pisania ciągów zawierających części programu; na przykład

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

Jest to najbliższa rzecz do tego, co prosicie, ale stosując powyższą metodę zachowuje newlines osadzonych w ciągu, więc to nie będzie działać bezpośrednio.

Można również zrobić to z ciąg konkatenacji (używając ..):

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

Dziękuję, [[]] było tym, czego szukałem! – bratao

+2

Chciałbym wypowiedzieć się przeciwko używaniu '..' za dużo: Każda pojedyncza konkatenacja spawns nowy ciąg, który potencjalnie może poważnie zaszkodzić wydajności. Jeśli chcesz umieścić wiele małych kawałków razem, umieszczenie ich w tabeli i użycie 'table.concat' jest lepszym rozwiązaniem. – jpjacobs

+4

Każda nowa konkatencja spawnuje nowy ciąg, ale wiele konkatencji w jednym ciągu jest wykonywanych jednocześnie = => spójrz na wynik luac dla powyższego; będzie tylko 1 kod operacyjny CONCAT. – daurnimator

1

Czy próbował string.sub (s, i [i, j]) funkcja. może wyglądać tutaj:

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

+0

Zastanawiam się, jak to jest pomocne; pytanie OP polega na zbudowaniu długiego łańcucha od mniejszych, a nie na odwrót, na co odpowiada - coraz mniejsze ciągi z większego 'string.sub'. – legends2k

0

następująco:

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

C/C++ składnia powoduje kompilator, aby zobaczyć to wszystko jako jeden duży ciąg. Jest zwykle używany do odczytu.

Równowartość Lua byłoby:

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

Należy pamiętać, że C/C++ składnia jest w czasie kompilacji, natomiast równowartość Lua prawdopodobnie robi konkatenacji w czasie wykonywania (choć kompilator teoretycznie może zoptymalizować go). To jednak nie powinno być wielkim problemem.

3

Położyłem wszystkie porcje w jednym stole i użyłem na nim table.concat. Pozwala to uniknąć tworzenia nowych łańcuchów przy każdej konkatenacji. na przykład (nie licząc napowietrznych ciągów w 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 

Jak widać, ten wybucha dość szybko. Lepiej jest:

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

Co zajmie około 3 * 4 + 12 = 24 bajty.

+0

Łączenie tabel może być wspaniałe, aby zaoszczędzić pamięć, ale będzie około 4 razy wolniejsze niż przy użyciu czystego łączenia ciągów. – devius

13

Większość odpowiedzi tutaj rozwiązuje ten problem w czasie wykonywania, a nie podczas kompilacji.

Lua 5.2 wprowadza sekwencję ucieczkową \z, aby rozwiązać ten problem elegancko, nie ponosząc żadnych kosztów w czasie wykonywania.

> 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 przeskakuje wszystkich kolejnych znaków w ciągu aż do pierwszego znaku nie-przestrzeni. Działa to również w przypadku liter nie-wieloliniowych.

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

Z Lua 5.2 Reference Manual

sekwencja ucieczki '\ Z' przeskakuje po rozpiętość białe znaki, włącznie przerwy linii; szczególnie przydatne jest łamanie i wciskanie długich literalnych ciągów do wielu wierszy bez dodawania nowych linii i spacji do zawartości ciągu.