#lua
Вот такой пример не работает, в нём при вызове функции 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()
Ответы
Ответ 1
У функции должен быть параметр 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 на самом деле нету классов, и их можно лишь эмулировать (в некоторой степени) при помощи таблиц. И чтобы эта эмуляция выглядела похожей, на использование классов, и был введён такой синтаксис.
Комментариев нет:
Отправить комментарий