用方括号调用时如何隐式传递`self`功能?

时间:2014-06-10 02:52:05

标签: lua

如果您调用这样的函数:

some_table:method (a, b)

...然后函数将接收some_table作为其第一个参数,并且许多函数将此self复制(或使用符号function Some_Class:method (a, b)为它们完成),并假设它是一个具有此功能的对象。

但是,如果在实现时不知道要调用的方法的名称,则需要使用方括号来访问函数,如下所示:

some_table [method_name] (a, b)

...在这种情况下,相应的方法不会some_tableself。当然我们可以手动传递它,如下所示:

some_table [method_name] (method_name, a, b)

但这有点不方便(特别是如果some_table实际上是一个像some_other_table [member].children [4]:getHelperTable().helper这样的表达式(一个人为的例子)。是否存在某种语法糖或魔法技巧来传递self隐含在这种情况下?

1 个答案:

答案 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)