Kurso de Raku / Objektoj, en- kaj eligo kaj escepto / Klasoj kaj objektoj / La metaobjekta protokolo 🆕
Metametodoj
Metametodo estas vokata per .^ anstataŭ
.. La ordinara .method rulas metodon de la
objekto; la .^method vokas metodon sur la
metaobjekto de la objekto — ĝi demandas pri la tipo
anstataŭ agi kiel la tipo.
Vi renkontis .^name, kiu redonas la nomon de la
tipo:
say 42.^name; # IntAliaj metametodoj inspektas la strukturon de tipo.
.^attributes listigas ĝiajn atributojn, kaj
.^find_method diras al vi, ĉu metodo ekzistas:
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 redonas la ordon de metodserĉado — la
ĉenon de tipoj, kiujn Raku traserĉas, laŭvice, kiam ĝi serĉas metodon.
Ĝi estas la hereda linio de klaso:
class A {}
class B is A {}
say B.^mro.map(*.^name); # (B A Any Mu)B heredas de A, kaj ĉiu tipo finfine de
Any kaj Mu, do metodvoko sur B
estas serĉata laŭ ĝuste tiu vojo. Ĉi tiuj metametodoj transformas la
strukturon de viaj tipoj en datumojn, kiujn vi povas pridemandi je
rultempo.
Praktiko
Vin atendas 1 kvizo pri la enhavo de ĉi tiu temo.
Kursa navigado
← La metaobjekta protokolo 🆕 | Kvizo — La metaobjekta protokolo →
💪 Aŭ iru rekte al la ekzercoj
de ĉi tiu sekcio.