Страницы

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

понедельник, 24 февраля 2020 г.

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

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

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

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