2009-09-10 49 views
31

多くの言語で、変数の割り当て時に文字列を連結できます。私は、既存の変数にコマンドの出力を追加する必要があるLuaプログラミング言語を使用して、シナリオを持っています。 Luaには以下の例と同等の機能がありますか?他の言語のLuaでの文字列の連結

例:

===== PERL ===== 
$filename = "checkbook"; 
$filename .= ".tmp"; 
================ 

===== C# ===== 
string filename = "checkbook"; 
filename += ".tmp"; 
=============== 

あなたの助けのために事前にありがとうございます。

答えて

62

はLuaの文字列連結演算子は、2個のドットである、と述べています。

あなたの簡単な例は次のように書かれます:

filename = "checkbook" 
filename = filename .. ".tmp" 

しかし、注意すべき注意点があります。 Luaの文字列は不変であるため、各連結は新しい文字列オブジェクトを作成し、ソース文字列のデータをその文字列にコピーします。そのため、1つの文字列に対して連続した連結を行うと、パフォーマンスが非常に悪くなります。

この場合のLuaのイディオムは、このようなものである:配列tに連結される文字列を収集することにより、

function listvalues(s) 
    local t = { } 
    for k,v in ipairs(s) do 
     t[#t+1] = tostring(v) 
    end 
    return table.concat(t,"\n") 
end 

、標準ライブラリルーチンtable.concatはそれらすべてを連結するために使用することができます(と一緒に不要な文字列のコピーを行わずに各ペアの間にセパレータ文字列を挿入します。

アップデート:私はちょうど私はもともとpairs()代わりのipairs()を使用して、上記のコードスニペットを書いたことに気づきました。もともと書かれたよう

、機能listvalues()は実際に渡されたテーブルからすべての値を生成しますが、安定しないか、予測可能な順序でしまいます。一方、それは1から#sまでの正の整数ではないキーの値を含みます。つまり、pairs()は、テーブルに格納されているすべての単一の(キー、値)ペアを生成します。

listvaluas()のようなものを使用する場合、ほとんどの場合、注文を保存することになります。したがって、listvalues{13, 42, 17, 4}と書かれた呼び出しは、その順序でそれらの値を含む文字列を生成します。しかし、pairs()はそれを行いません。テーブルデータ構造の基本的な実装に依存する何らかの順序で項目を分類します。順序はキーに依存するだけでなく、キーが挿入され、他のキーが削除された順序にも依存することが知られている。

もちろんipairs()も完璧な答えではありません。これは、「シーケンス」を形成するテーブルの値だけを列挙します。つまり、キーである値は、1からある上限までの連続したブロックを形成します。これは、通常、演算子#によって返された値です。 (多くの場合、関数ipairs()自体は、1から#sまでのより単純なforループに置き換えられました。これは、Lua 5.2とLuaJITの推奨プラクティスで、ipairs()イテレータ。)

pairs()が本当に正しいアプローチである場合は、通常、キーと値の両方を印刷したい場合があります。これにより、データを自己記述的にすることによって、順序に関する懸念が軽減されます。もちろん、任意のLuaタイプ(nilと浮動小数点NaNを除く)をキーとして使用することができ(そしてNaNも値として格納することができる)、文字列表現を見つけることは学生の練習として残されます。木々やテーブルのより複雑な構造を忘れないでください。

1

文字列は、連結演算子を使用して一緒に連結することができ、「..」これは私が思うの変数でも同じです

6

連結:Luaの文字列連結演算子がで示され

2つのドット( '..')。両方のオペランドが文字列または数字の場合、それらは§2.2.1で説明した規則に従って文字列に変換されます。それ以外の場合は、 "concat"メタメソッドが呼び出されます(§2.8を参照)。

から:http://www.lua.org/manual/5.1/manual.html#2.5.4

15

あなたはオペレータ..の短縮バージョンがありますかどうかを確認されていない場合は - 何もありません。 a ..= bを書くことはできません。あなたは、フルに入力する必要があります:他の回答としてfilename = filename .. ".tmp"