Где определить функции-члены таблицы в Lua - PullRequest
0 голосов
/ 21 февраля 2019

Насколько я понимаю, существует несколько способов определения функции-члена для таблицы в Lua.Например, следующие два, кажется, эквивалентны:

-- method a)
local table1 = {x = 1, y = 2}
function table1:myfunc()
    return self.x + self.y
end

-- method b)
local table2 = {
    x = 1,
    y = 2,

    myfunc = function(self)
        return self.x + self.y
    end,
}

Ранее использовав Python, мой инстинкт должен был бы использовать метод b) для более аккуратной группировки вещей.Однако, читая примеры, кажется, что люди обычно используют метод а) по соглашению.Я не могу найти какой-либо объективной причины того, почему она должна быть лучше.

Действительно, кажется, что, наоборот, есть причины, по крайней мере, заранее объявить переменную функции при инициализации таблицы, например,:

local table3 = {x = 1, y = 2, myfunc}
function table3:myfunc()
    return self.x + self.y
end

Таким образом, Lua знает о существовании члена с самого начала и может правильно настроить хэши, тогда как увеличение числа членов в существующей таблице может потребовать перефразировки (хотя я могу 'Я не представляю, что это когда-нибудь станет заметной проблемой производительности, если, возможно, вы не сделаете это для огромного количества небольших таблиц).Для сравнения источников: https://www.lua.org/gems/sample.pdf

Так есть ли основания не определять функции-члены непосредственно во время определения самой таблицы?Или это просто тот факт, что какой-то синтаксический сахар (синтаксис function name() и двоеточие) тогда недоступен?

1 Ответ

0 голосов
/ 21 февраля 2019

Как ботаник функционального программирования, я бы предпочел метод b, потому что он определяет таблицу сразу, а не изменяет ее один раз для каждого метода, который нам нужно добавить.Одна вещь, о которой вы должны знать, это то, что некоторые методы могут вызывать друг друга, и быстрее использовать локальные, чем вызывать self:myfunc().

local function myfunc(self)
  return self.x + self.y
end

local myTable = {
  x = 1,
  y = 2,
  myfunc = myfunc,

  moreMyfunc = function(self)
    return myfunc(self) * 2
  end,
}

Если отсутствие симметрии между методами мешает, вы можетесделайте все методы локальными и добавьте их в конструктор таблицы, как я только что сделал с myfunc.

Егор поднял еще один важный момент (который более актуален, если таблица является классом):

Метод a позволяет вам получить доступ к переменной table1 как значение изнутри ваших функций.Метод b не допускает этого.

В этом случае я бы заранее объявил имя таблицы.Преимущество этого заключается в том, что вы меняете переменную один раз, а не изменяете таблицу много раз.

local myTable

local function myfunc(self)
  return self.x + self.y
end

local function moreMyfunc(self)
  return myfunc(self) * 2
end

myTable = {
  x = 1,
  y = 2,
  myfunc = myfunc,
  moreMyfunc = moreMyfunc,
}
...