Как работает переменная self?
Lua конструктивно очень простой язык. И self это самая обыкновенная переменная, её особенность в том, что она автоматически создаётся при использовании двоеточия в объявлении или вызове функций (которые находятся внутри таблицы). Так вот self явлется ссылкой на эту самую таблицу.
Можно взять такой пример:local cat = {}
cat.name = 'Fluffy'
function cat:sayName()
  print(self.name)
end

cat:sayName()
Создаём таблицу cat, делаём строковое поле name, объявляем ещё функцию через двоеточие и появляется возможность использовать self.
Далее вот пример абсолютно идентичного кода, просто уберу весь синтаксический сахар:local cat = {}
cat['name'] = 'Fluffy'
cat['sayName'] = function(self)
  print(self['name'])
end

cat:sayName()
Или такlocal cat = {}
cat.name = 'Fluffy'
cat.sayName = function(self)
  print(self.name)
end

cat:sayName()
Или такlocal cat = {
  name = 'Fluffy',
  sayName = function(pet) -- не обязательно self
    print(pet.name)
  end
}

cat:sayName()
Или даже такlocal cat
local name = 'Fluffy'
local sayName = function() -- вообще пусто
  print(cat.name)
end

cat = {}
cat['name'] = name
cat['sayName'] = sayName

cat:sayName() -- Или просто cat.sayName() через точку
По аналогии с другими языками это this.
Прочитайте главу 16 "Объектно-ориентированное программирование" в книге "Программирование на языке Lua" Роберту Иерузалимски (рутрекер к вашим услугам).
Вот https://www.youtube.com/watch?v=F-xJq6s6lK0 видео поясняющее работу self (eng).