Вот такой пример не работает, в нём при вызове функции self == nil:
function test()
return {
foo = "bar",
say = function()
print(self.foo)
end
}
end
А вот так всё работает, но такая запись мне не нравится ):
function test()
local result = {foo = "bar"}
function result:say()
print(self.foo)
end
return result
end
Проверка:
local t = test()
t:say()
Ответ
У функции должен быть параметр self
function test()
return {
foo = "bar",
say = function(self)
print(self.foo)
end
}
end
Вызовы вида t:say() на самом деле всегда разворачивается в t.say(t) и если вы хотите внутри функции say() иметь доступ к полям таблицы, вам нужно объявить как минимум один параметр (с любым именем), в который вам и будет передана эта таблица. В Lua, общепринятое имя для такого параметра - self, но вы можете использовать любое.
Если у функции есть несколько параметров, то таблица будет всегда передаваться в качестве "нулевого" параметра, т.е вызов t:say(x, y) будет транслироваться в t.say(t, x, y) и при объявлении функции вы всегда должны ожидать параметр self на первом месте:
say = function(self, x, y)
print(self.foo)
end
Что касается синтаксиса с двоеточием, то это т.н. синтаксический сахар. В Lua на самом деле нету классов, и их можно лишь эмулировать (в некоторой степени) при помощи таблиц. И чтобы эта эмуляция выглядела похожей, на использование классов, и был введён такой синтаксис.
Комментариев нет:
Отправить комментарий