要遍历的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
从下面的2个答案的带走的是,你不应该把你的guildMembers'的'列表作为二维数组因为这有点愚蠢的工作。相反,从“guildMembers”的一维列表的角度来看它。每个成员(列表上的项目)是存储您所需信息的表或对象。 – greatwolf