有没有办法在不使用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()的情况下循环遍历数组?的主要内容,如果未能解决你的问题,请参考以下文章