我知道一些关于在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
所以,我只是想知道当我使用语法糖时发生了什么?
答案 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