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() через точку