如何传递指向不同函数的这些参数?

我对代码本身没有问题。我只是好奇这实际上是如何工作的。

下面是代码

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函数来搜索整个表格而不是New函数不了解矢量平面。

--更新:这是否意味着进入Vector2表,找到New函数,并使用New函数值运行Translate函数而不是编辑Vector2表的值,只编辑New函数值?

点赞
用户1517394
用户1517394

欢迎来到 Stack Overflow :)

在你的代码中,v1 = Vector2.New() 会调用 Vector2.New 函数,而函数返回的任何内容都会赋值给 v1

由于 Vector2.New 函数返回一个向量 (return vec),所以 v1 的结构如下:

v1 = {
    x = 0, -- 默认值,因为 Vector2.x == 0
    y = 0, -- 另一个默认值,因为 Vector2.y == 0
    mt = {}, -- 这是对 Vector2.mt 表的引用
    Translate = Vector2.Translate, -- 这是一个函数,即 Vector2.Translate 函数,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.Translate(v1, 10, 10) 中提供 v1 两次的替代方法是 v1:Translate(10, 10)

当 Lua 看到冒号 ( :) 而不是点 ( .) 时,它将左侧标识符(v1)作为第一个参数提供给函数。

它的功能与 v1.Translate(v1, 10, 10) 完全相同,只是 v1:Translate(10, 10) 更加简洁。

这被称为“语法糖”:

语法糖是设计用于使编程语言中的表达方式更易于阅读或表达的语法。它使语言更适合人类使用:事物可以更清晰、更简洁地表达,或者以某些人更喜欢的另一种样式表达。

希望有所帮助!

2019-07-11 01:57:49