Класи в lua, або позбавляємося двокрапки

Все це звичайно добре, навіть за певної вправності можна реалізувати успадкування ... Але де public і private члени класу? Дефакто в цьому прикладі всі вони public. Та ще й треба пам'ятати, де використовувати двокрапку:

а де просто одну точку:

А чи статичні члени класу? Невже доведеться відмовлятися?

От я й не захотів відмовлятися, і почав колгоспити.

Отже, уявляю вам мій колгосп:

А користуватись як? Дуже просто, ось вам шаблон:

Як бачите, при кожному виклику зсередини класу доведеться щоразу вказувати шлях, а ля «this.__private.privdata», зате вам приклад використання створеного класу!

При виклику цього коду буде створено об'єкт myobject з класу myclass, і буде викликано функцію pubfunc, яка висвітить вміст публічної змінної та змінить приватну. І ніяких проблем з двокрапками! До речі, статичні виклики теж працюють. Як із класу, так і з об'єкта.

Отже, коротко розповім, що за магія тут відбувається. А відбувається тут жонглювання так званими upvalues. upvalues ​​- це змінні, які зсередини видно, а зовні - ні! Дуже схоже на private, чи не так? Так ось, створивши функцію-«прототип», ми створили нову область видимості, і в неї помістили всі начинки нашого класу, винісши назовні тільки public і public static члени класу. А решту магії виконують метатаблиці, які дозволяють визначити, що саме відбуватиметься при запиті «неіснуючого» члена зовнішньої таблиці, яка представляє наш клас/об'єкт. Сумбурно звучить, знаю, але краще не можу пояснити - не спец :)

Довго думав, як можна зробити успадкування за такої системи, але так і не вигадав — upvalues ​​досить серйозно обмежує наші дії, а збоченнямиНачебто debug бібліотеки користуватися не хотілося - вона не всюди включена. Якщо хтось додумається, буду радий побачити!

PS: якщо для когось мій пост щось очевидне — щож, значить я переоцінив себе :) Не судіть суворо, може комусь навіщось знадобиться це рішення!

Хардкорна конфа за С++. Ми запрошуємо лише профі.