我最初在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
!
我不明白,这两个程序为什么打印不同的内容?
答案 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
)。