Disclaimer: мой «опыт» с lua составляет примерно два вечера, основной язык в данный момент Perl.
Как известно, вызов метода в lua выглядит вот так:
object:method(137); -- означает object["method"](object, 137);
Т.е. «класс» и «экземпляр» в простейшем случае совпадают. В то же время, есть перегрузка операторов вида
setmetatable(object, meta);
object + 137; -- означает meta["__add"](object, 137)
Виденные мной тьюториалы по ООП в lua, в частности, предлагают перегружать __index (т.е. оператор []), чтобы получить разделение «экземпляра» и «класса». Но это же хак (не говоря уже о том, что в таблице-экземпляре можно перезаписать method и тогда __index не вызовется).
Пример: http://lua-users.org/wiki/SimpleLuaClasses
Почему бы не соединить лучшее из двух миров? Например:
setclass(object, meta); -- никто не говорил слова "bless"
object:method(137); -- означает meta["method"](object, 137);
Или еще проще (проще ли?) - добавить метаметод __method, который будет действовать аналогично __index, но для для object:method(...)
Наверняка такой вопрос уже задавался - хотелось бы увидеть внятное объяснение, почему чего-то подобного ещё не сделали (в т.ч., если «ненужно», то почему)?
Перемещено true_admin из talks