Класи в lua, або позбавляємося двокрапки
Все це звичайно добре, навіть за певної вправності можна реалізувати успадкування ... Але де public і private члени класу? Дефакто в цьому прикладі всі вони public. Та ще й треба пам'ятати, де використовувати двокрапку:
а де просто одну точку:
А чи статичні члени класу? Невже доведеться відмовлятися?
От я й не захотів відмовлятися, і почав колгоспити.
Отже, уявляю вам мій колгосп:
А користуватись як? Дуже просто, ось вам шаблон:
Як бачите, при кожному виклику зсередини класу доведеться щоразу вказувати шлях, а ля «this.__private.privdata», зате вам приклад використання створеного класу!
При виклику цього коду буде створено об'єкт myobject з класу myclass, і буде викликано функцію pubfunc, яка висвітить вміст публічної змінної та змінить приватну. І ніяких проблем з двокрапками! До речі, статичні виклики теж працюють. Як із класу, так і з об'єкта.
Отже, коротко розповім, що за магія тут відбувається. А відбувається тут жонглювання так званими upvalues. upvalues - це змінні, які зсередини видно, а зовні - ні! Дуже схоже на private, чи не так? Так ось, створивши функцію-«прототип», ми створили нову область видимості, і в неї помістили всі начинки нашого класу, винісши назовні тільки public і public static члени класу. А решту магії виконують метатаблиці, які дозволяють визначити, що саме відбуватиметься при запиті «неіснуючого» члена зовнішньої таблиці, яка представляє наш клас/об'єкт. Сумбурно звучить, знаю, але краще не можу пояснити - не спец :)
Довго думав, як можна зробити успадкування за такої системи, але так і не вигадав — upvalues досить серйозно обмежує наші дії, а збоченнямиНачебто debug бібліотеки користуватися не хотілося - вона не всюди включена. Якщо хтось додумається, буду радий побачити!
PS: якщо для когось мій пост щось очевидне — щож, значить я переоцінив себе :) Не судіть суворо, може комусь навіщось знадобиться це рішення!
Хардкорна конфа за С++. Ми запрошуємо лише профі.