我对代码本身没有问题。我只是想知道这是如何工作的。
这是代码
Vector2 = {
x = 0, y = 0,
mt = {},
New = function()
local vec = {}
vec.x = Vector2.x
vec.y = Vector2.y
vec.mt = Vector2.mt
vec.Translate = Vector2.Translate
return vec
end,
Translate = function(self, dx, dy)
self.x = self.x + dx
self.y = self.y + dy
end
}
v1 = Vector2.New()
v1.x = 10
v1.y = 20
v1.Translate(v1, 10, 10)
print(v1.x, v1.y)
此代码尚处于早期阶段。我将要学习元表。这段代码可能并不聪明,但是我正在学习Lua教程,我只是对它的工作方式感到好奇。
据我了解,v1 = Vector2.New
会将v1
设置为标识符,以从表中调用New
函数。
我不明白的是,如何通过改变翻译的v1.Translate()
传递参数?
我本以为v1.Translate
是指New函数,而不是在整个表中搜索Translate函数。
-Update:这是要转到Vector2表中,找到New函数,然后使用New函数值运行Translate函数,而不是编辑Vector2表值,仅编辑New函数值吗?
答案 0 :(得分:2)
你好,欢迎来到Stack Overflow:)
在您的代码中v1 = Vector2.New()
将执行对Vector2.New
的调用,并且该函数返回的任何内容都将分配给v1
。
由于Vector2.New
函数返回了vec(return vec
),因此v1
如下所示:
v1 = {
x = 0, -- this is a default, because Vector2.x == 0
y = 0, -- another default because of Vector2.y
mt = {}, -- this is a reference to the same table in Vector2.mt
Translate = Vector2.Translate, -- this is a function, the Vector2.Translate function, functions are first-class values in Lua
}
因此,当您调用v1.Translate
时,您将调用与Vector2.Translate
相同的函数。
因此,当您执行v1.Translate(v1, 10, 10)
时,实际上是在执行Vector2.Translate(v1, 10, 10)
。但这不是不是,因为它具有可继承的魔力。这是因为您已将v1.Translate
定义为等于Vector2.Translate
。
函数是一流的价值
请记住,函数是Lua中的一等值。这意味着您可以像数字,字符串和表格一样传递它们。
如果您确实愿意,可以这样做(相当于v1.Translate(v1, 10, 10)
):
translateFn = v1.Translate
translateFn(v1, 10, 10)
语法糖
您可以执行以下操作,而不是在v1
中提供两次v1.Translate(v1, 10, 10)
:v1:Translate(10, 10)
。
当Lua看到使用冒号(:
)而不是点(.
)时,它将在左侧(v1
)上提供标识符,如下所示:该函数的第一个参数。
它的功能与v1.Translate(v1, 10, 10)
完全相同,只是v1:Translate(10, 10)
的清洁度是1000倍。
这称为“ syntactic sugar”:
语法糖是一种编程语言中的语法,旨在使事物更易于阅读或表达。它使该语言成为人类使用的“更甜美”的语言:事物可以更清晰,更简洁地表达,或者以某些人可能喜欢的替代方式来表达。
希望有帮助!