Здравствуйте и добро пожаловать в 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 раз чище.
Это называется " синтаксический сахар ":
Синтаксический сахар - это синтаксис в языке программирования, предназначенный для облегчения чтения или выражения. Это делает язык «более сладким» для использования человеком: вещи могут быть выражены более ясно, более кратко или в альтернативном стиле, который некоторые могут предпочесть.
Надеюсь, это поможет!