Страницы

Поиск по вопросам

воскресенье, 26 мая 2019 г.

Как правильно поместить метод в таблицу?

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

Комментариев нет:

Отправить комментарий