他の回答が言っているように、Lua の文字列連結演算子は 2 つのドットです。
簡単な例は次のように記述されます。
filename = "checkbook"
filename = filename .. ".tmp"
ただし、注意すべき点があります。Lua の文字列は不変であるため、連結ごとに新しい文字列オブジェクトが作成され、ソース文字列からデータがコピーされます。これにより、単一の文字列への連続した連結のパフォーマンスが非常に低下します。
この場合の Lua のイディオムは次のようなものです。
function listvalues(s)
local t = { }
for k,v in ipairs(s) do
t[#t+1] = tostring(v)
end
return table.concat(t,"\n")
end
連結する文字列を array に集めることによりt
、標準ライブラリ ルーチンtable.concat
を使用して、不必要な文字列のコピーを行わずに (各ペア間の区切り文字列と共に) それらをすべて連結することができます。
更新:pairs()
の代わりに使用して、最初に上記のコード スニペットを作成したことに気付きましたipairs()
。
最初に書かれたように、関数listvalues()
は実際に渡されたテーブルからすべての値を生成しますが、安定した順序または予測可能な順序ではありません。一方、1
toのスパンでキーが正の整数ではない値が含まれます#s
。つまりpairs()
、テーブルに格納されているすべての (キー、値) ペアを生成します。
ほとんどの場合listvaluas()
、順序を維持することに関心があるようなものを使用します。したがって、次のように記述された呼び出しlistvalues{13, 42, 17, 4}
は、それらの値をその順序で含む文字列を生成します。ただし、pairs()
それは行われません。テーブル データ構造の基になる実装に依存する順序で項目化されます。順序はキーだけでなく、キーが挿入され、他のキーが削除された順序にも依存することが知られています。
もちろんipairs()
、完璧な答えでもありません。「シーケンス」を形成するテーブルの値のみを列挙します。つまり、キーの値は、1 からある上限までの途切れのないブロックを形成します。これは (通常)#
演算子によって返される値でもあります。(多くの場合、関数自体は toからカウントするだけipairs()
の単純なループに置き換えたほうがよいでしょう。これは Lua 5.2 および LuaJIT で推奨される方法であり、反復子よりも単純なループの方が効率的に実装できます。)for
1
#s
for
ipairs()
pairs()
本当に正しいアプローチである場合は、通常、キーと値の両方を出力する必要があります。これにより、データが自己記述型になるため、順序に関する懸念が軽減されます。もちろん、任意の Lua タイプ (nil
およびfloat を除くNaN
) をキーとして使用NaN
できる (また、値として格納することもできる) ため、文字列表現を見つけることは学生の課題として残されています。また、ツリーとテーブルのより複雑な構造についても忘れないでください。