要遍历 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