有没有办法在不使用pair()的情况下遍历数组?

时间:2016-02-03 08:07:24

标签: arrays loops lua

我可以使用常规{'a', 'b', 'c'}循环遍历数组/表(例如for)。然后使用pairs

进行迭代
for _, v in pairs({'a', 'b', 'c'}) do
  io.write(v..'\n')
end

但是当我有一个普通的旧阵列时,我真的不会发现自己关心钥匙。

有没有像

那样迭代的方法
for value in array do end

我确实看到了这种情况。例如,我正在使用库在我的游戏中创建地图,我发现你可以像这样访问地图图层中的对象

for object in map.layer["platform"].nameIs("platform") do  

可以这样迭代吗?

2 个答案:

答案 0 :(得分:7)

对于数组,自然的方式是使用ipairs,而不是pairs。但是,它仍然需要一把钥匙:

for _, v in arr do

如果您真的想避开关键项,请创建自己的迭代器。 Lua中的编程提供了一个例子:

function values(t)
    local i = 0
    return function() i = i + 1; return t[i] end
end

然后你可以像这样使用它:

local arr = {'a', 'b', 'c', 'd'}
for e in values(arr) do
    print(e)
end

答案 1 :(得分:6)

  

我发现你可以像这样访问地图图层中的对象    for map.layer [“platform”]中的对象.nameIs(“platform”)

您在这里看到的只是与自定义迭代器一起使用的泛型 .nameIs("platform")返回的函数基本上类似于ipairs。

例如,可以像这样实现该语法(尽管它不是您的库可能实际执行的操作):

local object = {
    platform = {1,2,3,4},
    mob = {4,3,2,1}
}

function object.nameIs(idx)
    local array = object[idx]
    local i = 0
    return function ()
        i = i+1
        return array[i]
    end
end

print "-- Platforms --"
for value in object.nameIs("platform") do
    print(value)
end

print "-- Mobs --"
for value in object.nameIs("mob") do
    print(value)
end

有关更详细的说明,请参阅“Lua编程”在线手册,您想看到7 - Iterators and the Generic For

部分