如何在一个表中收集多个数据,然后像一个连接字符串一样输出到LUA中
我完全不熟悉LUA脚本,尝试创建一个表,其中包含一个接一个接收到的数据,然后在同一个函数中使用它来输出收集到的数据如何在一个表中收集多个数据,然后像一个连接字符串一样输出到LUA中,lua,world-of-warcraft,Lua,World Of Warcraft,我完全不熟悉LUA脚本,尝试创建一个表,其中包含一个接一个接收到的数据,然后在同一个函数中使用它来输出收集到的数据 function PremadeFrame_OnEvent(self, event, arg1, arg2) --start chat_msg_raid_leader if (event == "CHAT_MSG_RAID" or event == "CHAT_MSG_RAID_LEADER" ) then battlegrounds = {}; if st
function PremadeFrame_OnEvent(self, event, arg1, arg2)
--start 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;
但它只输出一个接收到的数据,例如,第一个玩家的名字是斯卡里尔,其他人是约翰,马克斯,它从斯卡里尔,约翰,马克斯那里获取数据,但输出类似
[BG Number 43], Scarill
我希望它能像这样输出
[BG Number 43] Scarill, Max
[BG Number 54] John
我猜
predeframe\u OnEvent
是一个事件回调函数。每次呼叫时,新的战场
表格都会在里面创建,所以很自然,里面只有一件物品。如果你想捕获比当前物品更多的物品,你需要在predeframe\u OnEvent
外部设置battlegrounds
,如下所示:
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
因此,不会每次在事件处理程序中重新创建该字符串。每次调用事件处理程序时,都需要扩展该字符串:
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 ...
但是,如果可以使用相同的arg1
和arg2
多次调用predeframe\u OnEvent()
,但您在字符串中重复了,那么您需要将战场[number]作为一个表,并且仅添加arg2
(如果尚未在该表中)。示例(未测试,可能是语法错误):
风格说明:尽量使用
本地
除非需要全局我一开始也这么想,因为我来自另一种脚本语言,当你声明函数之外的东西时,你必须使它全局或类似的东西。我照你说的做了,但现在又回来了empty@Sercankd我刚刚更新了代码(注意战场[number]=arg2),看看这是否会改变输出。我认为还有另一个问题,接收到的数据不是即时的,也不是同步的。我想收集是有问题的everything@Sercankd是的,如果没有更多的上下文信息,很难判断什么是错的。但至少你知道你的第一个方法是错误的。
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