Вы не одиноки, мне потребовалось немало времени, чтобы получить этот код. Вот моя интерпретация
каждая таблица может иметь netatable, metatable может хранить среди прочего функции, проиндексированные по имени, а setmetatable устанавливает значение метатаблицы достаточно естественно.
Строка class._index = .., где происходит магия.
Когда вы пытаетесь вызвать функцию с помощью self.fn1 (), тогда lua ищет в себе имя fn1. Если он не может найти его, он ищет в метатализируемой себя таблицу __index
и ищет 'fn1' в таблице, хранящейся там.
Теперь метатабелем для себя в вашем примере является класс, поэтому lua ищет в метатаблице (классе) запись __index, чтобы посмотреть, есть ли в этой таблице функция с именем fn1, и она есть, поэтому она возвращается. Вам нужно установить __index для класса обратно на себя, чтобы lua выглядел так же, как и в случае с метафизом - эй, что сбивает с толку.
(кроме того, присваивание __index должно происходить только один раз, но по какой-то причине оно всегда выполняется в новом операторе во всех примерах lua - я беру это вне нового в моих классах - экономит несколько циклов)
Затем вы возвращаете новую таблицу o, lua - это сборщик мусора, поэтому при возврате в local каждый раз создается новая таблица.
function newInstance (class)
local o = {}
setmetatable (o, class)
class.__index = class
return o
end
НТН