web-dev-qa-db-ja.com

大きなluaストリングを小さなストリングに分割する方法

大きな文字列(base64でエンコードされた画像)があり、長さは1050文字です。 Cのように、小さな文字列で構成された大きな文字列を追加するにはどうすればよいですか?

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

Lua 2.4文字列でのプログラミング によると:

二重角括弧[[...]]を照合することによっても、リテラル文字列を区切ることができます。この括弧で囲まれた形式のリテラルは、数行実行され、ネストされ、エスケープシーケンスを解釈しない場合があります。さらに、このフォームは、この文字が改行である場合、文字列の最初の文字を無視します。この形式は、プログラムの断片を含む文字列を書く場合に特に便利です。例えば、

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"
36
crashmstr

ここでのほとんどの回答は、コンパイル時ではなく実行時にこの問題を解決します。

Lua 5.2では、エスケープシーケンス\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リファレンスマニュアル

エスケープシーケンス '\ z'は、改行を含む次の空白文字のスパンをスキップします。文字列の内容に改行やスペースを追加せずに、長いリテラル文字列を複数の行に分割してインデントすると特に便利です。

1:\zを含むすべてのエスケープシーケンスは、短いリテラル文字列"…"'…')でのみ機能しますそして、当然のことながら、長いリテラル文字列[[...]]など)にはありません

15
legends2k

すべてのチャンクをテーブルに配置し、その上で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バイトかかります。

3
jpjacobs

String.sub(s、i [、j])関数を試しましたか。あなたはここを見たいかもしれません:

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

1
A. K.

この:

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

C/C++構文により、コンパイラーはそれをすべて1つの大きな文字列として認識します。一般的に読みやすさのために使用されます。

Luaに相当するものは次のとおりです。

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

C/C++構文はコンパイル時ですが、Luaの同等の構文は実行時に連結を行う可能性が高いことに注意してください(コンパイラーは理論的には最適化できます)。しかし、それは大したことではないはずです。

0
Nicol Bolas