为什么lua的语法糖在这里不起作用(用冒号调用函数)?

时间:2017-04-27 04:34:17

标签: lua syntactic-sugar

我知道一些关于在lua中调用函数语法糖的知识。

A = {}
function A.func(a) print(tostring(a))end

我上面有一张表A.我可以像这样调用A.func A.func(A) 我也可以这样打A:func()

但是当我在表B中保存A和A.func,然后尝试回拨。错误发生了," 尝试调用零值(方法' v')"

B = {}
B[A] = A.func

--call A.func
k,v = next(B)
k:v()--error happened here
v(k)--no error occurred

所以,我只是想知道当我使用语法糖时发生了什么?

2 个答案:

答案 0 :(得分:2)

语法sugar使这些命令等效

> A["func"](A)
table: 009F7E58
> A.func(A)
table: 009F7E58
> A:func()
table: 009F7E58

因此,如果尝试执行命令k:v(),则它与k [“v”](k)相同。但你的表k没有记录“v”,它有记录“func”。所以你可以运行

> k["func"](k)
table: 009F7E58

> v(k)
table: 009F7E58

> k:func()
table: 009F7E58

如您所见,变量“v”包含函数本身,而不是表k中函数的名称。但是如果想要使用语法糖,你需要知道表中带有函数的记录的名称。

P.S。是的,在您的示例中,“k”和“A”是同一个表的名称(009F7E58)。

答案 1 :(得分:1)

当您使用k:v() v时,不会对上面的本地变量v提供帮助。 k:v()语法告诉lua在对象v中找到名为k的函数并执行它,并将k作为第一个参数传递。

另一个例子可能更好地表明了这种行为:

k = {}
function k.v(a) print(tostring(a))end
local function v(a) print("local func called", a) end
k:v() -- this method always call k.v function 
      -- no matter that variable with same name exists