要遍历 2D 数组,您可以使用内部和外部 ipairs() 迭代器,或者在常规 for do 循环中按顺序使用“索引”以获取数字索引。您还可以将 pairs() 与所有索引类型(如数字和字符串)一起使用,但将采用“未定义”顺序。
除了在代码中更远的地方之外,您都可以很好地使用这两种方法,pairs 与ipairs 的问题基本上假设您希望它“按顺序”,以及代码中的其他挫败迹象:)。这种混淆很常见。您还尝试错误地迭代内部数组,您可以直接访问它们作为索引。你可以做for j,v2 in ipairs(v) do,这几乎是这种事情的成语。
在 Lua 表中“包含”两个数组,如索引数据、和名称/值对数据,它们在内部是独立的,并且“有时”具有不同的语义。在“对”迭代器的情况下,它们是不同的。 :) ipairs() 对“索引”数据进行操作,pairs() 迭代名称/值数据。当您使用 bob[i]=fred; 添加行时,您将添加到表的“索引”部分,因为有各种规则来管理这一点。
如果只需要内部元素,请将外部(和内部)视为任何表格:
for i, v in ipairs(guildMembers) do print(v[1] .. ':' ..v[2]) end
否则获取内部元素,然后冲洗并重复:
for i,v in ipairs(x) do for j,v2 in ipairs(v) do print(v2) end end
这是一个可以自行测试的模型:
local guildMembers = {}
local visibleMembers = 10;
if visibleMembers then
-- building using 'for'
for index = 1, visibleMembers do
local name = "name" .. index --GetGuildRosterInfo(index);
local weeklyXP = index * 12345 --GetGuildRosterContribution(index);
guildMembers[index] = {}
guildMembers[index][1] = name;
guildMembers[index][2] = weeklyXP;
end
-- reading using 'ipairs'
for i, v in ipairs(guildMembers) do
print(i.. ': ' ..v[1].. ' xp: ' ..v[2]);
end
-- or
for i, v in ipairs(guildMembers) do
for j, v2 in ipairs(v) -- takes the 'object' in 'v' and iterates sub
print(i..' '..j.. ': ' ..v2.. 'name or xp');
end
end
end
这是您重做的代码,它可能会按原样工作:
-- say my name
local playerName = UnitName("player");
ChatFrame1:AddMessage('Hi my name is: ' .. playerName);
-- locals
local guildMembers = {}
local totalMembers, onlineMembers = GetNumGuildMembers();
local visibleMembers = onlineMembers;
if thenGetGuildRosterShowOffline() then
visibleMembers = totalMembers;
end
if visibleMembers then
-- build list
for index=1, visibleMembers do
local name = GetGuildRosterInfo(index);
local weeklyXP = GetGuildRosterContribution(index);
-- method 1 (ordered in likeliness of least to most expensive)
--guildMembers[index] = { name, weeklyXP, }
-- method 2
--tinsert(guildMembers, { name, weeklyXP, })
-- method 3
--local item = { }; item[1] = name; item[2] = weeklyXP;
--guildMembers[index] = item
-- method 4 - original
guildMembers[index] = {}
guildMembers[index][1] = name;
guildMembers[index][2] = weeklyXP;
--DEFAULT_CHAT_FRAME:AddMessage('name: '..guildMembers[index][1]..
-- ' weeklyXP: '..guildMembers[index][2]);
end
-- print
for i, v in ipairs(guildMembers) do
--for j, v2 in ipairs(i) do -- dont want loop if print in same line print(i.. ': ' ..v[1].. ' xp: ' ..v[2]);
--end
end
end