Курс 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 | Описати
змінну →
💪 Або перейдіть одразу до вправ цього
розділу.