Lua: вызов функции двоеточия и точки действует по-разному - PullRequest
0 голосов
/ 12 октября 2018

Я изначально сталкивался с этим при разработке своей игры в 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 !!
Я не понимаю, почему эти две программы печатают разные вещи?

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

посмотрите еще раз на ваше использование self

function x:foo()
    return y.bar(self) -- = y.bar(x)
end

function x:foo()
    return y:bar() -- = y.bar(y)
end
0 голосов
/ 13 октября 2018

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

Определение функции , устанавливаемое в поле таблицы, может быть методом, то есть с :.Поля вложенных таблиц также допустимы для методов и не методов, если ключи являются строками, которые являются действительными идентификаторами Lua, как в x.y.z.

Но

print(x.y().z:foo(a, b))

одинаковоas

local _ = x.y().z
print(_.foo(_, a, b))

С синтаксисом вызова метода , левая часть : является выражением (x.y().z), которое вычисляется только один раз.

0 голосов
/ 12 октября 2018

x:foo() является синтаксическим сахаром для x.foo(x)

, что означает, что

function x:foo()
    return y:bar()
end

на самом деле

function x:foo()
    return y.bar(y)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...