`__call` 在我的 Lua 代码中无法正常工作。

我认为一个简单的虚拟示例文件比长篇累牍更能解释问题。

t = {}
t.__call = print
t.__call(1)
t(2)

根据文档的说明,由于t是一个表,对t的调用,如t(2),应该被重定向到对t.__call的调用,如t.__call(2)t.__call工作正常,没有问题,但“语法糖”失败了。以下是上述代码的输出:

1
lua:test.lua:4:尝试调用全局“ t”(一个表值)
堆栈回溯:
        test.lua:4:在主块中
        [C]:在?

我错过了什么?为什么t(2)没有转换为t.__call(2)

点赞
用户20043
用户20043

__call 是一种元方法,应该设置在 table 的元表 上,而不是表本身。

t = {}
m = {}
m.__call = print

setmetatable(t, m)

t(2)

在这里查看。 参见 @Deduplicator 的精简方法。

2014-12-05 21:41:34