Lua:冒号和点函数调用的行为不同

时间:2018-10-12 13:09:46

标签: lua

我最初在LOVE2D中开发游戏时遇到了这个问题,但我不知道为什么。
据我所知,x:foo()只是x.foo(self)的语法糖,但是将其与其他类结合使用会产生一些奇怪的行为。
基本上,我有两个程序

y = {}

function y:bar()
    return self.b
end

x = {}

function x:foo()
    return y.bar(self)
end

print(x.foo({b = 3}))

这将按预期打印3

y = {}

function y:bar()
    return self.b
end

x = {}

function x:foo()
    return y:bar()
end

print(x.foo({b = 3}))

但这会打印nil
我不明白,这两个程序为什么打印不同的内容?

3 个答案:

答案 0 :(得分:3)

x:foo()x.foo(x)的语法糖

这意味着

function x:foo()
    return y:bar()
end

实际上是

function x:foo()
    return y.bar(y)
end

答案 1 :(得分:0)

再次查看您对self的使用

function x:foo()
    return y.bar(self) -- = y.bar(x)
end

function x:foo()
    return y:bar() -- = y.bar(y)
end

答案 2 :(得分:0)

  

x:foo()只是x.foo(self)

的语法糖

这在函数定义的上下文中是正确的,但在表达式中却不正确。

function x.y.z:foo(a, b)
    print(self, a, b)
end

相同
function x.y.z.foo(self, a, b)
    print(self, a, b)
end

function definition设置为表字段可以是一种方法,即使用:。如果键是有效的Lua标识符的字符串,例如x.y.z,则对于方法和非方法也允许使用嵌套表字段。

但是

print(x.y().z:foo(a, b))

相同
local _ = x.y().z
print(_.foo(_, a, b))

method call syntax中,:的左侧是仅计算一次的表达式(x.y().z)。