質問
多くの言語では、変数の割り当てで文字列を連結できます。 Luaプログラミング言語を使用して、既存の変数にコマンドの出力を追加する必要があるシナリオがあります。 Luaには以下の例と機能的に同等のものがありますか?
他の言語の例:
===== PERL =====
$filename = "checkbook";
$filename .= ".tmp";
================
===== C# =====
string filename = "checkbook";
filename += ".tmp";
===============
ご協力ありがとうございます。
解決
他の回答が述べているように、Luaの文字列連結演算子は2つのドットです。
単純な例は次のように記述されます。
filename = "checkbook"
filename = filename .. ".tmp"
ただし、注意すべき注意事項があります。 Luaの文字列は不変なので、各連結は新しい文字列オブジェクトを作成し、ソース文字列からデータをコピーします。これにより、1つの文字列への連続した連結のパフォーマンスが非常に低下します。
この場合の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
連結する文字列を配列 t
に収集することにより、標準ライブラリルーチン table.concat
を使用して、それらを(セパレータ文字列とともに)連結します。不要な文字列のコピーなし。
更新: ipairs()
ではなく、 pairs()
を使用して上記のコードスニペットを最初に記述したことに気付きました。
最初に書かれたように、関数 listvalues()
は渡されたテーブルから実際にすべての値を生成しますが、安定した順序や予測可能な順序ではありません。一方、キーが 1
から #s
の範囲の正の整数ではない値が含まれます。それが pairs()
が行うことです。テーブルに保存されているすべての(キー、値)ペアを生成します。
listvaluas()
のようなものを使用するほとんどの場合、順序を維持することに関心があります。したがって、 listvalues {13、42、17、4}
として記述された呼び出しは、それらの値をその順序で含む文字列を生成します。ただし、 pairs()
はそれを行いません。テーブルのデータ構造の基礎となる実装に依存する何らかの順序でそれらを項目化します。順序はキーだけでなく、キーが挿入され、他のキーが削除された順序にも依存することが知られています。
もちろん ipairs()
も完璧な答えではありません。 「シーケンス」を形成するテーブルの値のみを列挙します。つまり、キーである値は、1から上限までの切れ目のないブロックを形成します。これは(通常)#
演算子によって返される値でもあります。 (多くの場合、関数 ipairs()
自体は、 1
から#にカウントする単純な
。これは、Lua 5.2およびLuaJITで推奨される方法で、 for
ループに置き換える方が適切です。 s ipairs()
イテレータよりも単純な for
ループをより効率的に実装できます。)
pairs()
が本当に正しいアプローチである場合、通常はキーと値の両方を印刷する必要があります。これにより、データが自己記述的になるため、順序に関する懸念が軽減されます。もちろん、Luaタイプ( nil
および浮動小数点 NaN
を除く)はキーとして使用できます(および NaN
も保存できます)値として)文字列表現を見つけることは、学生の練習問題として残されます。また、ツリーやテーブルのより複雑な構造も忘れないでください。
他のヒント
演算子 ..
の短縮形があるかどうかを尋ねる場合-いいえ、ありません。 a .. = b
を書くことはできません。完全に入力する必要があります: filename = filename .." .tmp"
連結:
Luaの文字列連結演算子は、2つのドット( '..')で示されます。両方のオペランドが文字列または数値の場合、§ 2.2.1に記載されている規則に従って、文字列に変換されます。それ以外の場合、" concat" metamethodが呼び出されます(§ 2.8を参照)。
連結演算子" .."を使用して文字列を結合できます
これは、私が考える変数についても同じです