Курс по 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; # Stash

Stash (хеш с таблица на символите) става полезен, когато работите с модули, където ви позволява да потърсите имената, които модулът дефинира. Ще се върнем към него в раздела за модулите; засега е достатъчно да знаете, че WHO съществува и какво представлява.

Навигация в курса

Използване на VAR   |   Опишете променлива


💪 Или преминете направо към упражненията в този раздел.