【问题标题】:Lua - Execute a Function Stored in a TableLua - 执行存储在表中的函数
【发布时间】:2013-06-12 22:13:20
【问题描述】:

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

编辑:

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

【问题讨论】:

  • 不清楚您希望在循环中如何或调用什么。也许你可以解释并给出伪代码。顺便说一句——Lua 没有指针。函数是function 类型的值,可以在表达式中的任何位置使用。
  • @TomBlodget,感谢您指出这一点。我更正了。

标签: function lua function-pointers lua-table


【解决方案1】:

简短回答:要调用存储在数组中的函数(引用),您只需添加 (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),所以当这个片段被执行时,你会得到“表索引为零”错误,因为你试图存储@ 987654328@ 使用nil 作为索引。

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

【讨论】:

    【解决方案2】:

    根据你们的回答和评论,我想出了以下代码作为解决方案:

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

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

    asd[1][1]
    

    像这样访问它:

    asd["scene0"][1]
    

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

    谢谢各位。

    【讨论】:

    • 你可能可以用元表做到这一点,但它也可能不值得努力;)
    【解决方案3】:

    目前还不清楚您要做什么。在您的匿名函数中,您将返回一个使用on_scene 的返回值作为键的表。但是您的 on_scene 不会返回任何内容。 talk 也一样。

    我假设您希望在调用 game_level_hints 表中的每个级别时调用 on_scenetalk

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 2014-11-28
      • 2018-02-27
      相关资源
      最近更新 更多