2010-03-14 342 views
3

使用Lua,我试图动态地调用带参数的函数。 我想发出一个字符串的方式,解析:Lua:动态调用带参数的函数

  • 第一个参数是一个类的实例“处理”
  • 第二点是被称为
  • 所有剩下的参数的函数

“模块”是像{ string=<instance of a class> }
分裂()是一个简单的解析器返回表与索引字符串AA表。

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 

当我尝试这与“忽略删除鲍勃”,由“参考文献1”,它试图呼吁与模块“忽略”相关的实例“删除”,并给出了说法“鲍勃”,包含在一个表中(具有单个值)。

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

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”,或者当我用“参考1”中的“bob”替换“unpack(args)”时,“remove”中的变量“name”仍然是零。

+0

你的代码看起来不错。 “另一方”是什么样的。 – 2010-03-14 06:43:53

+0

功能'split'看起来像什么,因为它不是标准Lua的一部分。 – 2010-03-14 07:01:32

回答

3

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

要解决此问题,您可以使remove“静态函数”如下所示:function TIF_Ignore.remove(name)。但是,您还必须以类似的方式更改rawremoverawremovetmp,无论是声明还是调用网站。其他(更简单)选项不是从args表中删除module,它应该是第一个传递的参数。

+0

谢谢!我选择了这样一个“最好的”,因为你指出了这个问题。我在Lua没有经验,我只是想“让这件事情起作用”,而且你做到了!谢谢! – Tipx 2010-03-15 03:50:45

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返回删除的元素,可以在空表上调用它。
+0

谢谢,你是anwser帮助我指出了一些其他问题,我没有意识到,并需要修复! – Tipx 2010-03-15 03:52:02