Курс языка программирования 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 |
Описание
переменной →
💪 Или перейдите сразу к упражнениям этого
раздела.