Курс языка программирования Raku / Объекты, ввод-вывод и исключения / Классы и объекты / Протокол метаобъектов 🆕
Метаметоды
Метаметод вызывается через .^, а не через
.. Обычный .method выполняет метод объекта, а
.^method вызывает метод у метаобъекта
объекта — он спрашивает о типе, а не действует как тип.
Вы уже встречали .^name, который возвращает имя
типа:
say 42.^name; # IntДругие метаметоды исследуют устройство типа.
.^attributes перечисляет его атрибуты, а
.^find_method сообщает, существует ли метод:
class Animal {
has $.name;
method speak { 'generic' }
}
say Animal.^attributes.elems; # 1
say so Animal.^find_method('speak'); # True
say so Animal.^find_method('fly'); # False.^mro возвращает порядок разрешения методов —
цепочку типов, которые Raku по очереди просматривает при поиске метода.
Это линия наследования класса:
class A {}
class B is A {}
say B.^mro.map(*.^name); # (B A Any Mu)B наследует от A, а всякий тип в конечном
счёте — от Any и Mu, поэтому вызов метода у
объекта B ищется ровно по этому пути. Эти метаметоды
превращают устройство ваших типов в данные, которые можно запрашивать во
время выполнения.
Практика
Пройдите 1 тест по содержанию этой темы.
Навигация по курсу
← Протокол метаобъектов 🆕 | Тест — Протокол метаобъектов →
💪 Или перейдите сразу к
упражнениям этого раздела.