我如何通过这些涉及不同职能的争论?

时间:2019-07-11 01:38:34

标签: lua

我对代码本身没有问题。我只是想知道这是如何工作的。

这是代码

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函数值吗?

1 个答案:

答案 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”:

  

语法糖是一种编程语言中的语法,旨在使事物更易于阅读或表达。它使该语言成为人类使用的“更甜美”的语言:事物可以更清晰,更简洁地表达,或者以某些人可能喜欢的替代方式来表达。

希望有帮助!