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; # Int

Aliaj 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.