Курс 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   |   Описати змінну


💪 Або перейдіть одразу до вправ цього розділу.