lua,迭代和调用n = 3层表的所有同名函数

Posted

技术标签:

【中文标题】lua,迭代和调用n = 3层表的所有同名函数【英文标题】:lua, iterating and calling all same-named-functions of n=3 tiers of tables 【发布时间】:2021-08-15 07:43:06 【问题描述】:

假设我在 game 中有多个表格,例如 bullets,其中 bullets 有多个表格,如下所示。我将如何遍历并调用 game 中包含的所有更新函数? --下面是一个简化的例子,假设 bullets 中的每个表都有多个条目,而不仅仅是更新。并且最终代码必须在像 game=bullets,coins,whatever 这样的情况下工作,每个条目都与子弹具有相似的性质。

game=
   
game.bullets=update=function(self) end,..., update=function(self) end,...,...

for obj in all(game) do
  for things in all(obj) do
    things:update() end end

--我不确定我做错了什么以及是否需要双 for 循环。 --如果子弹没有嵌入到 game 中,那就是:

for obj in all(bullets) do
obj:update()
end

我也试过了:

for obj in all(game.bullets) do
    obj:update()
    end

*修正:这行得通,但我想解决的问题是,如果我在 game 中有多个像 bullets 这样的表,那么我想解决这个问题。因此,第一次尝试双迭代失败了。因此,我不想像 game 中的项目一样多次重复上述内容,而是想输入一个语句。

【问题讨论】:

您的代码中的all 是什么?还是您不知道pairsipairs 函数是什么,而这就是您要寻找的答案? Programming In Lua: 4.3.5 – Generic for 【参考方案1】:

all() 不是 Lua 中的标准函数。这是您在某处找到的辅助函数吗?

如果没有看到更多示例或说明如何使用它的文档以及预期的返回值,很难说清楚。似乎是一个迭代器,本质上类似于pairs()。可能是这样的:

for key, value in pairs( game ) do
    for obj in all( value ) do
        obj :update()
    end 
end

【讨论】:

正如您正确得出的结论,“所有”只是抓取表格中的每个 obj。所以它相当于 javascrpt: for (var of arr) --for...of 循环。你知道为什么双循环不起作用吗? 它是 pico8 api 的内置部分,我忘了它不是原生的 lua。 wh0am1.dev/pico8-api 哦,是的,所以它只是for key, val in pairs(tbl),但他们正在扔掉“钥匙”。通常你会把它写成for _,v in pairs(t),然后就可以理解_被忽略了。仍然不能完全确定。 pico-8.fandom.com/wiki/All 如果我不得不猜测,它会挂在某个地方的零或重复条目上。 for key, val in pairs(game) do print( type(key), key, type(val), val ) end 我想这些子弹实际上是相同的。

以上是关于lua,迭代和调用n = 3层表的所有同名函数的主要内容,如果未能解决你的问题,请参考以下文章

lua迭代器和泛型for浅析

Chapter7 迭代器

二Lua迭代器与泛型for

python-day5-生成器迭代器及递归调用

在 LUA for 循环的迭代之间应用延迟

lua 10 迭代器