Курс языка программирования 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   |   Описание переменной


💪 Или перейдите сразу к упражнениям этого раздела.