如何遍历表以调用其中存储的每个函数? (卢阿)

Posted

技术标签:

【中文标题】如何遍历表以调用其中存储的每个函数? (卢阿)【英文标题】:How Do I Iterate Through a Table to Call Each Function Stored In It? (Lua) 【发布时间】:2021-10-04 22:53:59 【问题描述】:

我怎样才能使这段代码工作?它应该打印“Function a”然后是“Function b”,但它给了我错误。这是我想在主文件中迭代的模块中有一堆函数的其他一些文件的做法。

--stuff for module ----------------------
local funcs = 

function funcs.a()
    print("Function a")
end

function funcs.b()
    print("Function b")
end

return funcs

-- stuff for main file---------------

for k,v in pairs(funcs) do
    funcs[k]()
end

编辑:我试图让这段代码在一个文件中作为测​​试工作。一旦成功,我计划将这些片段移动到两个不同的文件中。

如果我将以下代码全部放在一个文件中,为什么它会给我错误 '' expected near 'for'

local funcs = 

function funcs.a()
    print("Function a")
end

function funcs.b()
    print("Function b")
end

return funcs

for k,v in pairs(funcs) do
    v()
end

【问题讨论】:

你是如何在主文件中初始化变量funcs的? 目前只有一个文件。在弄清楚如何使其工作后,我打算将它们分为主模块和模块。 error '' 预计在 'for' 附近 - 因为 return funcs 不在函数中。- 删除或注释掉它。另一件事是for do end 没有检查v 的类型,这不是很好的风格。为它做一个简单的条件:if type(v)=='function' then v() end returns funcs 只有在您实际将代码放入单独的模块文件时才应该存在。在return 语句之后,在当前范围内没有执行任何操作。并且编译器不希望在同一范围内返回后看到任何关键字。这就是为什么你得到编译器错误eof expected (eof = end of file) 【参考方案1】:

如果没有错误,我们真的帮不了那么多,但我猜这是与 func 是模块文件中的局部变量有关的问题。

如果您的模块如下所示: module.lua

local funcs = 

function funcs.a()
    print("Function a")
end

function funcs.b()
    print("Function b")
end

return funcs

你的主要看起来像这样: main.lua

dofile("module.lua")

for k,v in pairs(funcs) do
    funcs[k]()
end

main.lua 中的变量funcs 将是nil。 要使用模块的返回值,您必须在加载模块时在 main 中分配一个新变量:

main.lua

-- you can name this variable however you like
local funcs = dofile("module.lua")

for k, v in pairs(funcs) do
    -- you can also use the value directly instead of func[k]
    v()
end

【讨论】:

我试图运行我在同一个文件中发布的代码。我提到模块的事情是为了澄清我未来实现代码的计划。 @Tailcoat 如果当前在同一个文件中,return funcs之后的代码将不会被执行【参考方案2】:

k是key,包含函数名,v是value,包含函数代码。

函数是Lua中的一等公民,所以你可以简单地写:

for k,v in pairs(funcs) do
  v()
end

它将显示:

Function a
Function b

【讨论】:

以上是关于如何遍历表以调用其中存储的每个函数? (卢阿)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用一个类来存储在不同函数中更新的变量,然后在不同的函数中调用这些更新的变量?

从 Azure 表存储中获取 1000 多个数据集

我将如何制作带有网格的建筑工具? (机器人卢阿)

如何调用Oracle plsql中另一个存储函数返回名称的存储函数?

我如何在函数中调用某个参数?

如何正确解析 JSON 表以用于 Value 函数?