如何在Lua中收集多个数据并输出为连接字符串形式的表格

我完全不了解LUA脚本,试图创建一个表,用一次接收到的数据,然后在同一函数中使用它来输出收集的数据。

function PremadeFrame_OnEvent(self, event, arg1, arg2)
  --开始CHAT_MSG_RAID_LEADER事件处理
  if (event == "CHAT_MSG_RAID" or event == "CHAT_MSG_RAID_LEADER" ) then
    battlegrounds = {};
    if string.find(arg1,"BGNUMBER") then
      number = string.match(arg1,"%d+");
      battlegrounds[number] = "";
      battlegrounds[number] = battlegrounds[number]..","..arg2;
      for k,v in pairs(battlegrounds) do
      DEFAULT_CHAT_FRAME:AddMessage ("\124c0000FFFF[BG Number:"..k.."]"..v.."");
      end
    end
  end
end

我试图使用以下方式将数据添加到其他数据结尾。

battlegrounds[number] = battlegrounds[number]..","..arg2;

但它仅输出接收到的一个数据,例如第一个玩家名为Scarill,其他玩家名为John,Max,它从Scarill,John,Max获取数据,但输出如下。

[BG Number 43], Scarill

我希望输出像以下这样的结果:

[BG Number 43] Scarill, Max
[BG Number 54] John
点赞
用户735446
用户735446

我猜PremadeFrame_OnEvent是一个事件回调函数。每次调用都会在其中创建新的battlegrounds表格,因此自然它只有一个项目。如果你想捕获比当前项目更多的项目,你需要像这样将battlegrounds外部化于PremadeFrame_OnEvent:

battlegrounds = {}

function PremadeFrame_OnEvent(self, event, arg1, arg2)
  --start chat_msg_raid_leader
  if (event == "CHAT_MSG_RAID" or event == "CHAT_MSG_RAID_LEADER" ) then
    if string.find(arg1,"BGNUMBER") then
      number = string.match(arg1,"%d+")
      battlegrounds[number] = arg2
      for k,v in pairs(battlegrounds) do
        DEFAULT_CHAT_FRAME:AddMessage ("\124c0000FFFF[BG Number:"..k.."]"..v.."")
      end
    end
  end
end

所以它不会在事件处理程序中每次重新创建。

2014-03-31 08:37:51
用户869951
用户869951

每次调用事件处理程序时,都需要扩展字符串:

local battlegrounds = {}

function PremadeFrame_OnEvent(self, event, arg1, arg2)
  --start chat_msg_raid_leader
  if (event == "CHAT_MSG_RAID" or event == "CHAT_MSG_RAID_LEADER" ) then
    if string.find(arg1,"BGNUMBER") then
      number = string.match(arg1,"%d+")
      if battlegrounds[number] == nil then
          battlegrounds[number] = arg2
      else
          battlegrounds[number] = battlegrounds[number] .. "," .. arg2
      end
      for k,v in ...

但是如果PremadeFrame_OnEvent()可以多次带有相同的arg1arg2调用,但你的字符串中出现重复,则需要将battlegrounds[number]设置为一个表,只有在该表中不存在时才添加arg2。示例(未经过测试,可能存在语法错误):

local battlegrounds = {}

function PremadeFrame_OnEvent(self, event, arg1, arg2)
  --start chat_msg_raid_leader
  if (event == "CHAT_MSG_RAID" or event == "CHAT_MSG_RAID_LEADER" ) then
    if string.find(arg1,"BGNUMBER") then
      local number = string.match(arg1,"%d+")
      if battlegrounds[number] == nil then
          battlegrounds[number] = {[arg2] = 1} -- use hash map, will be easiest to search for arg2 later
      else
          -- only add arg2 if not already in there:
          local bgn = battlegrounds[number]
          if bgn[arg2] == nil then
              table.insert(bgn, arg2)
          end
      end

      for k,v in pairs(battlegrounds) do
          local msg = "\124c0000FFFF[BG Number:" .. k .. "]" .. table.concat(v, ',')
          DEFAULT_CHAT_FRAME:AddMessage(msg)
      end
    end
  end
end

风格上的注意事项:除非需要全局化,否则始终尝试使用local

2014-03-31 20:49:22