Курс 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 тест за змістом цієї теми.
Навігація курсом
← Протокол метаоб’єктів 🆕 | Тест — Протокол метаоб’єктів →
💪 Або перейдіть одразу до
вправ цього розділу.