91

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

他の言語の例:

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

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

よろしくお願いいたします。

4

5 に答える 5

142

他の回答が言っているように、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()は実際に渡されたテーブルからすべての値を生成しますが、安定した順序または予測可能な順序ではありません。一方、1toのスパンでキーが正の整数ではない値が含まれます#s。つまりpairs()、テーブルに格納されているすべての (キー、値) ペアを生成します。

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

もちろんipairs()、完璧な答えでもありません。「シーケンス」を形成するテーブルの値のみを列挙します。つまり、キーの値は、1 からある上限までの途切れのないブロックを形成します。これは (通常)#演算子によって返される値でもあります。(多くの場合、関数自体は toからカウントするだけipairs()の単純なループに置き換えたほうがよいでしょう。これは Lua 5.2 および LuaJIT で推奨される方法であり、反復子よりも単純なループの方が効率的に実装できます。)for1#sforipairs()

pairs()本当に正しいアプローチである場合は、通常、キーと値の両方を出力する必要があります。これにより、データが自己記述型になるため、順序に関する懸念が軽減されます。もちろん、任意の Lua タイプ (nilおよびfloat を除くNaN) をキーとして使用NaNできる (また、値として格納することもできる) ため、文字列表現を見つけることは学生の課題として残されています。また、ツリーとテーブルのより複雑な構造についても忘れないでください。

于 2009-09-10T19:19:23.723 に答える
22

省略形の演算子があるかどうかを尋ねている場合は、..ありません。書くことはできませんa ..= b。完全に入力する必要があります。filename = filename .. ".tmp"

于 2009-09-10T16:39:01.947 に答える
8

連結:

Luaの文字列連結演算子は、2つのドット('..')で示されます。両方のオペランドが文字列または数値の場合、§2.2.1に記載されている規則に従って文字列に変換されます。それ以外の場合は、「concat」メタメソッドが呼び出されます(§2.8を参照)。

差出人:http ://www.lua.org/manual/5.1/manual.html#2.5.4

于 2009-09-10T14:29:36.273 に答える
3

文字列は、連結演算子「..」を使用して結合できます。

これは私が思う変数についても同じです

于 2009-09-10T14:29:11.907 に答える