8

我能够将函数存储到表中。但现在我不知道如何调用它们。决赛桌将有大约 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

Aa和函数定义:

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

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

编辑:

我修改了函数,所以它们会有更多的上下文。基本上,它们现在返回字符串。我希望发生的是,在调用函数结束时,我将有一个包含所有这些字符串的表(最好是级别表)。

4

3 回答 3

8

简短的回答:要调用存储在数组中的函数(引用),您只需添加(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),因此当执行此片段时,当您尝试将其用作索引进行存储时,会出现“表索引为零”nil错误nil

如果你想调用你存储的函数game_level_hints.levels["level0"],你只需game_level_hints.levels["level0"]()

于 2013-06-17T02:14:59.523 回答
5

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

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

现在,asd包含我需要的区域字符串。尽管理想情况下,我希望能够访问以下数据:

asd[1][1]

像这样访问它:

asd["scene0"][1]

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

多谢你们。

于 2013-06-17T03:09:39.750 回答
1

目前还不清楚您要做什么。在您的匿名函数中,您将返回一个使用on_scene' 的返回值作为键的表。但是你on_scene没有返回任何东西。同样的事情talk

我将假设您在调用表中的每个级别时都想要on_scene并被talk调用game_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
于 2013-06-17T02:12:14.787 回答