Lua - 执行存储在表中的函数

时间:2013-06-17 01:35:44

标签: function lua function-pointers lua-table

我能够将功能存储到表中。但现在我不知道如何调用它们。最终表将有大约100个调用,所以如果可能的话,我想像在foreach循环中一样调用它们。谢谢!

以下是表格的定义方式:

game_level_hints = game_level_hints or {}
game_level_hints.levels = {}
game_level_hints.levels["level0"] = function()
    return
    {
        [on_scene("scene0")] =
        {
            talk("hint0"),
            talk("hint1"),
            talk("hint2")
        },
        [on_scene("scene1")] =
        {
            talk("hint0"),
            talk("hint1"),
            talk("hint2")
        }
    }
end

Aaand函数定义:

function on_scene(sceneId)
    -- some code
    return sceneId
end

function talk(areaId)
    -- some code
    return areaId
end

修改

我修改了这些函数,因此它们会有更多的上下文。基本上,他们现在返回字符串。 我希望发生的是,在调用函数的最后,我将有一个包含所有这些字符串的表(理想情况下是level表)。

3 个答案:

答案 0 :(得分:7)

简答:要调用存储在数组中的函数(引用),只需添加(parameters),就像通常那样:

local function func(a,b,c) return a,b,c end
local a = {myfunc = func}
print(a.myfunc(3,4,5)) -- prints 3,4,5

实际上,您可以将其简化为

local a = {myfunc = function(a,b,c) return a,b,c end}
print(a.myfunc(3,4,5)) -- prints 3,4,5

答案很长:你没有描述你的预期结果是什么,但是你所写的内容可能来做你期望的事情。拿这个片段:

game_level_hints.levels["level0"] = function()
    return
    {
        [on_scene("scene0")] =
        {
            talk("hint0"),
        }
    }
end

[问题更新后,此段落不再适用] 您引用on_scenetalk函数,但不“存储”那些表中的函数(因为你在问题中明确引用它们,我认为问题是关于这些函数)。你实际上调用这些函数并存储它们返回的值(它们都返回nil),所以当执行这个片段时,你会得到“table index is nil”错误使用nil作为索引存储nil

如果您想调用game_level_hints.levels["level0"]中存储的功能,只需执行game_level_hints.levels["level0"]()

答案 1 :(得分:3)

使用你们的回答和评论,我能够提出以下代码作为解决方案:

asd = game_level_hints.levels["level0"]()

现在,asd包含我需要的区域字符串。虽然理想情况下,我打算能够访问如下数据:

asd[1][1]

访问它,如:

asd["scene0"][1]

检索区域数据就足够了。我只需要解决问题。

谢谢,伙计们。

答案 2 :(得分:1)

你要做的事情并不是很清楚。在匿名函数中,您将返回一个使用on_scene的返回值作为键的表。但是你的on_scene没有返回任何内容。 talk也是如此。

我将假设您在调用on_scene表格中的每个级别时要调用talkgame_level_hints

如果是这样,你可以这样做:

local maxlevel = 99
for i = 0, maxlevel do
  game_level_hints.levels["level" .. i] = function()
    on_scene("scene" .. i)
    talk("hint" .. i)
  end
end
-- ...
for levelname, levelfunc in pairs(game_level_hints.levels) do
  levelfunc()
end