Raku kurss / Objekti, ievade/izvade un izņēmumi / Klases un objekti / Metaobjektu protokols 🆕

Metametodes

Metametodi izsauc ar .^, nevis ar .. Parastā .method izpilda objekta metodi; .^method izsauc metodi uz objekta metaobjekta — tā jautā par tipu, nevis darbojas kā tips.

Ar .^name, kas atgriež tipa nosaukumu, jau esat sastapušies:

say 42.^name; # Int

Citas metametodes izpēta tipa struktūru. .^attributes uzskaita tā atribūtus, un .^find_method pasaka, vai metode eksistē:

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 atgriež metožu atrisināšanas secību — tipu ķēdi, ko Raku secīgi pārmeklē, meklējot metodi. Tā ir klases mantošanas līnija:

class A {}
class B is A {}

say B.^mro.map(*.^name); # (B A Any Mu)

B manto no A, un katrs tips galu galā no Any un Mu, tāpēc metodes izsaukums uz B tiek meklēts tieši pa šo ceļu. Šīs metametodes pārvērš jūsu tipu struktūru par datiem, ko izpildes laikā var izprašņāt.

Prakse

Jūs gaida 1 viktorīna par šī temata saturu.

Kursa navigācija

Metaobjektu protokols 🆕   |   Viktorīna — Metaobjektu protokols


💪 Vai arī dodieties tieši uz šīs sadaļas vingrinājumiem.