Lua:用参数动态调用函数

时间:2010-03-14 05:40:08

标签: lua dynamic-function

使用Lua,我正在尝试使用参数动态调用函数。 我想以下列方式发送要解析的字符串:

  • 第一个参数是一个类实例“Handle”
  • 第二个是要调用的函数
  • 剩下的就是参数

“modules”是一个类似{ string=<instance of a class> }的表格 split()是一个简单的解析器,它返回一个带有索引字符串的表。

function Dynamic(msg)
    local args = split(msg, " ")
    module = args[1]
    table.remove(args, 1)
    if module then
        module = modules[module]
        command = args[1]
        table.remove(args, 1)
        if command then
            if not args then
                module[command]()
            else
                module[command](unpack(args))  -- Reference 1
            end
        else
            -- Function doesnt exist
        end
    else
        -- Module doesnt exist
    end
end

当我尝试使用“ignore remove bob”时,通过“Reference 1”,它尝试在模块中与“ignore”关联的实例上调用“remove”,并给出包含在表中的参数“bob” (单个值)。

但是,在调用的另一端,remove函数不会接收参数。我甚至试图用

替换“参考1”行
module[command]("bob")

但我得到的结果相同。

这是另一个函数,它不接收参数"bob"

function TIF_Ignore:remove(name)
    print(name)  -- Reference 2
    TIF_Ignore:rawremove(name)
    TIF_Ignore:rawremovetmp(name)
    print(title.. name.. " is not being ignored.")
end

当我试图找出错误时,我在代码中添加了“参考2”。当我“忽略删除bob”时,或者当我在“Reference 1”上用“bob”替换“unpack(args)”时,“remove”中的变量“name”仍为nil。

2 个答案:

答案 0 :(得分:3)

声明function TIF_Ignore:remove(name)相当于function TIF_Ignore.remove(self, name)。注意在第一种情况下使用冒号,它会添加额外的隐藏参数来模拟OOP和类。您调用该函数的方式是,将“bob”作为self参数而不是name传递。

要解决此问题,您可以将remove“静态功能”设为:function TIF_Ignore.remove(name)。但是,您还必须以类似的方式更改rawremoverawremovetmp,包括声明和调用网站。另一个(更简单)选项是不从module表中删除args,它应该是传递的第一个参数。

答案 1 :(得分:3)

如果要调用使用冒号:语法定义的函数,则必须向其传递一个额外的参数,即它期望的表。由于您提供的特定示例不使用self,因此您可以切换到点.语法,但如果您需要完整的通用性,请查看以下代码:

function Dynamic(msg)
    local args   = split(msg, " ")
    local module = table.remove(args, 1)
    if module and modules[module] then
        module = modules[module]
        local command = table.remove(args, 1)
        if command then
            local command = module[command]
            command(module, unpack(args))
        else
            -- Function doesnt exist
        end
    else
        -- Module doesnt exist
    end
end

我还解决了一些小问题:

  • 变量应为local
  • args总是非零。
  • 查找modules[module]可能会失败。
  • table.remove返回删除的元素,可以在空表上调用它。