Модуль l для Lua

Небольшая библиотека для языка программирования Lua.

Скачать
Версия 0.4 (7.53 КБ)
Наверх

Class

Каркас для ООП.

Lua язык прототипного программирования и не имеет явной системы для работы с классами, но имеет таблицы, которые можно за них выдать с помощью замыканий и метатаблиц.

Animal = l.class({
    name = '';
    say = '';

    info = function(self)
        print(('%s говорит "%s".'):format(self.name, self.say));
    end;
});

Cat = l.class(Animal, {
    name = 'Кошка';
    say = 'мяу, бэйба';
});

function Cat: __init()
    print('Про кошку:');
end;

dog = Animal();
dog.name = 'Собака';
dog.say = 'гав';

-- Собака говорит "гав".
dog:info();

-- Про кошку:
cat = Cat();

-- Кошка говорит "мяу, бэйба".
cat:info();

Сами объекты выглядят следующим образом.

l.dump(dog);
--[[ (table)table: 005FCC98 {
    [info] => (function)function: 00439ED8
    [name] => (string)Собака
    [say] => (string)гав
} ]]

l.dump(getmetatable(dog));
--[[ (table)table: 004381B8 {
    [__class] => (string)Animal
} ]]

l.dump(cat);
--[[ (table)table: 004412C0 {
    [info] => (function)function: 00439ED8
    [name] => (string)Кошка
    [say] => (string)мяу, бэйба
} ]]

l.dump(getmetatable(cat));
--[[ (table)table: 00438528 {
    [__class] => (string)Cat
} ]]

У самих классов метаталицы вернут __name (название) и "магические" методы: метаданные, __init, __parents (все родители), __parent (основной родитель, то есть последний в иерархии наследования) и т.д.

-- Animal
print(Cat.__parent.__name);

Родителей можно полуать по цепочке.

-- nil - в данном случае, т.к. Animal ничего не наследуцет
print(Cat.__parent.__parent.__parent.__name);