Курс по 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 тест върху съдържанието на тази тема.

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

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


💪 Или преминете направо към упражненията в този раздел.