如何在使用方括号调用函数时隐式传递“self”?

如果你这样调用一个函数:

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

点赞
用户148870
用户148870

不行。

唯一的语法糖是 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 foo = some_other_table[member].children[4]:getHelperTable().helper
foo[method_name](foo)
2014-06-10 02:56:27