は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
も値として格納することができる)、文字列表現を見つけることは学生の練習として残されます。木々やテーブルのより複雑な構造を忘れないでください。