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

Posted

技术标签:

【中文标题】有没有办法在不使用pairs()的情况下循环遍历数组?【英文标题】:Is there any way to loop through an array without using pairs()? 【发布时间】:2016-05-12 07:50:10 【问题描述】:

我可以使用常规的 for 循环遍历数组/表(例如 'a', 'b', 'c')。然后使用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  

有什么方法可以这样迭代吗?

【问题讨论】:

我发现自己非常需要钥匙。当您只想遍历数组部分时,ipairs 是要走的路。 你的 IDE 将永远纠缠你代码中每一个 gazilliard 未使用的索引变量。这太糟糕了。 【参考方案1】:

对于数组,自然的方式是使用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

【讨论】:

您是否缺少for _, v in ipairs(arr) do 中的ipairs【参考方案2】:

我看到你可以像这样访问地图层中的对象for object in 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

【讨论】:

以上是关于有没有办法在不使用pairs()的情况下循环遍历数组?的主要内容,如果未能解决你的问题,请参考以下文章

在不使用 ForEach 循环的情况下遍历列表

有没有办法在不使用循环的情况下获得价值?

如何在不包含相同元素两次的情况下遍历列表?

有没有办法在没有嵌套循环的情况下遍历数字列表的所有组合?

有没有办法在不显示窗口的情况下使用 cv2.waitkey() ?

有没有办法在不安装的情况下引用 ghostscript DLL?