Курс языка программирования 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 тест по содержанию этой темы.

Навигация по курсу

Протокол метаобъектов 🆕   |   Тест — Протокол метаобъектов


💪 Или перейдите сразу к упражнениям этого раздела.