3

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"
4

4 に答える 4

8

私はそうは思いません: たとえば、キーと値の間の区切り文字がスペースであることをどのように伝えますか?

あなたが望むことをするために、一般的なマッピング関数を書くことができます:

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")
于 2013-03-18T13:18:58.810 に答える
6

簡単な答え: いいえ。

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')
于 2013-03-18T13:19:42.103 に答える
4

いいえ。ただし、回避策があります。

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')
于 2013-03-18T13:15:43.917 に答える
0
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
于 2021-06-07T06:49:32.860 に答える