web-dev-qa-db-ja.com

Luaでの文字列の連結

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

他の言語の例:

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

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

よろしくお願いします。

51

他の答えが言ったように、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_を使用して、不要な文字列のコピーなしに(各ペア間の区切り文字列とともに)それらをすべて連結できます。

更新:pairs()の代わりにipairs()を使用して上記のコードスニペットを最初に記述したことに気付きました。

最初に書かれたように、関数listvalues()は渡されたテーブルからすべての値を実際に生成しますが、安定した順序または予測可能な順序ではありません。一方、キーが_1_から_#s_の範囲の正の整数ではない値が含まれます。それがpairs()が行うことです。テーブルに保存されているすべての(キー、値)ペアを生成します。

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

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

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

91
RBerteig

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

17
sbk

連結:

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

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

7
dcruz

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

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

1
Jambobond