Курс по 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 тест върху съдържанието на тази тема.
Навигация в курса
← Протоколът на метаобектите 🆕 | Тест — Протоколът на метаобектите →
💪 Или преминете направо към
упражненията в този раздел.