Курс 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 тест за змістом цієї теми.

Навігація курсом

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


💪 Або перейдіть одразу до вправ цього розділу.