如果您调用这样的函数:
some_table:method (a, b)
...然后函数将接收some_table
作为其第一个参数,并且许多函数将此self
复制(或使用符号function Some_Class:method (a, b)
为它们完成),并假设它是一个具有此功能的对象。
但是,如果在实现时不知道要调用的方法的名称,则需要使用方括号来访问函数,如下所示:
some_table [method_name] (a, b)
...在这种情况下,相应的方法不会some_table
为self
。当然我们可以手动传递它,如下所示:
some_table [method_name] (method_name, a, b)
但这有点不方便(特别是如果some_table
实际上是一个像some_other_table [member].children [4]:getHelperTable().helper
这样的表达式(一个人为的例子)。是否存在某种语法糖或魔法技巧来传递self
隐含在这种情况下?
答案 0 :(得分:4)
不。
此表单中唯一的语法糖是foo:bar(...)
,它转换为foo.bar(foo, ...)
- 您只需手动提供第一个参数的任何其他内容。
你当然可以写一个包装函数:
function selfcall(obj, method, ...)
obj[method](obj, ...)
end
然后你的例子变得像......
selfcall(some_other_table[member].children[4]:getHelperTable().helper,
method_name)
当然,另一种选择是使用local来存储表达式:
local foo = some_other_table[member].children[4]:getHelperTable().helper
foo[method_name](foo)