使用Lua,我正在尝试使用参数动态调用函数。 我想以下列方式发送要解析的字符串:
“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。
答案 0 :(得分:3)
声明function TIF_Ignore:remove(name)
相当于function TIF_Ignore.remove(self, name)
。注意在第一种情况下使用冒号,它会添加额外的隐藏参数来模拟OOP和类。您调用该函数的方式是,将“bob”作为self
参数而不是name
传递。
要解决此问题,您可以将remove
“静态功能”设为:function TIF_Ignore.remove(name)
。但是,您还必须以类似的方式更改rawremove
和rawremovetmp
,包括声明和调用网站。另一个(更简单)选项是不从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
返回删除的元素,可以在空表上调用它。