table.concat の arg 2 値を使用して現在のテーブル インデックスを表す方法はありますか?
例えば:
t = {}
t[1] = "a"
t[2] = "b"
t[3] = "c"
X = table.concat(t,"\n")
テーブル連結 (X) の望ましい出力:
"1 a\n2 b\n3 c\n"
table.concat の arg 2 値を使用して現在のテーブル インデックスを表す方法はありますか?
例えば:
t = {}
t[1] = "a"
t[2] = "b"
t[3] = "c"
X = table.concat(t,"\n")
テーブル連結 (X) の望ましい出力:
"1 a\n2 b\n3 c\n"
私はそうは思いません: たとえば、キーと値の間の区切り文字がスペースであることをどのように伝えますか?
あなたが望むことをするために、一般的なマッピング関数を書くことができます:
function map2(t, func)
local out = {}
for k, v in pairs(t) do
out[k] = func(k, v)
end
return out
end
function joinbyspace(k, v)
return k .. ' ' .. v
end
X = table.concat(map2(t, joinbyspace), "\n")
簡単な答え: いいえ。
table.concat
非常に基本的で、非常に高速です。
したがって、とにかくループで実行する必要があります。
過度の文字列連結を避けたい場合は、次のようにします。
function concatIndexed(tab,template)
template = template or '%d %s\n'
local tt = {}
for k,v in ipairs(tab) do
tt[#tt+1]=template:format(k,v)
end
return table.concat(tt)
end
X = concatIndexed(t) -- and optionally specify a certain per item format
Y = concatIndexed(t,'custom format %3d %s\n')
いいえ。ただし、回避策があります。
local n = 0
local function next_line_no()
n = n + 1
return n..' '
end
X = table.concat(t,'\0'):gsub('%f[%Z]',next_line_no):gsub('%z','\n')
function Util_Concat(tab, seperator)
if seperator == nil then return table.concat(tab) end
local buffer = {}
for i, v in ipairs(tab) do
buffer[#buffer + 1] = v
if i < #tab then
buffer[#buffer + 1] = seperator
end
end
return table.concat(buffer)
end
使用法tab
は、テーブル入力がある場所であり、区切り文字は両方nil
または文字列です (nil
通常のように動作する場合table.concat
)
print(Util_Concat({"Hello", "World"}, "_"))
--Prints
--Hello_world