Курс по Raku / Напреднали / Контейнери / Интроспекция на контейнери
WHO и HOW
Още два инструмента за интроспекция допълват набора: HOW
и WHO.
HOW
Всяка стойност в Raku е подкрепена от метаобект — обект,
който знае как работи типът на стойността. HOW (съкратено
от Higher Order Workings) връща този метаобект:
my $x = 42;
say $x.HOW.^name; # Perl6::Metamodel::ClassHOWВие сте използвали метаобекта през цялото време, може би без да
забелязвате. .^ в .^name е извикване на метод,
маршрутизирано чрез HOW. Тези два реда са еквивалентни:
my $x = 42;
say $x.^name; # Int
say $x.HOW.name($x); # IntТака че $x.^name е просто по-кратък начин за записване
на $x.HOW.name($x). Забележете, че обектът се предава
отново като аргумент: метаобектът е споделен от всяка стойност
на типа, така че мета-методът е информиран за кой обект е попитан.
Формата .^ прави това автоматично вместо вас. (За
name аргументът се оказва игнориран, но предаването му е
правилната, обща форма — някои мета-методи го използват.)
Същото се отнася и за други мета-методи, които може да срещнете, като
например .^methods, който изброява методите, на които
стойността отговаря.
WHO
WHO връща пакета, към който принадлежи дадено
име — таблицата на символите, дефинирани в това пространство от
имена:
say Int.WHO.^name; # StashStash (хеш с таблица на символите) става полезен, когато
работите с модули, където ви позволява да потърсите имената, които
модулът дефинира. Ще се върнем към него в раздела за модулите; засега
е достатъчно да знаете, че WHO съществува и какво
представлява.
Навигация в курса
← Използване на
VAR | Опишете
променлива →
💪 Или преминете направо към упражненията в този
раздел.