Курс по Raku / Обекти, вход-изход и изключения / Класове и обекти / Протоколът на метаобектите 🆕
Добавяне на методи по време на изпълнение
MOP не служи само за разглеждане — той може и да
променя типа, докато програмата работи. Метаметодът
.^add_method добавя нов метод към клас:
class Empty {
}
Empty.^add_method('greet', method { 'hi' });
say Empty.new.greet; # hiКласът Empty е дефиниран изобщо без методи.
Empty.^add_method('greet', …) след това прикачва метод на
име greet, зададен като анонимен method { … }.
От този момент нататък всеки обект Empty отговаря на
.greet, точно както ако беше записан в класа.
Това е истинско метапрограмиране: на метаобекта на Empty
се казва да си отгледа нов метод. Същият протокол стои в основата на
възможности, които вече използвахте — концептуално, когато пишете
class, role, has или
method, компилаторът изгражда вашия тип чрез методи на MOP
като .^add_method и .^add_attribute от ваше
име.
„Концептуално“, защото това е модел на езика, а не обещание за някой
конкретен компилатор. MOP е онова, чрез което обектната система е
специфицирана; дали дадена реализация буквално прекарва всяка
декларация през тези метаметоди — и дали можете да я наблюдавате как го
прави — зависи от самата реализация. По същата причина
извикването на тези метаметоди от вас зависи от реализацията:
кои от тях излага даден компилатор и как точно се държат, може да се
различава, така че код, който посяга към .^add_method и
подобните му, може да не работи еднакво във всеки Raku.
Добавянето на методи по време на изпълнение е мощен и рядко нужен инструмент. Повечето програми никога не посягат към него, но именно то прави обектната система на Raku отворена: правилата на класовете сами са написани чрез MOP, така че можете да ги разширявате. За ежедневния код метаметодите за разглеждане от предишната тема са частта от MOP, която наистина ще използвате.
Навигация в курса
← Тест — Протоколът на метаобектите | Намерете метод →
💪 Или преминете направо към
упражненията в този раздел.