Курс языка программирования Raku / Продвинутый уровень / Контейнеры / Интроспекция с помощью МОП

WHAT и ^name

WHAT — это псевдо-метод, который даёт доступ к типу значения. Его можно использовать так же, как .^name:

my $var = 42;

say $var.^name;
say $var.WHAT;

Оба выводят тип с небольшим отличием в оформлении: .^name даёт голое имя, а WHAT показывает объект типа, заключённый в скобки:

Int
(Int)

Для переменной без ограничения типа тип начинается как Any. Как только вы присвоите значение, и ^name, и WHAT следуют за типом хранимого значения:

my $var;
say $var.^name; # Any
say $var.WHAT;  # (Any)

$var = 'Hello';
say $var.^name; # Str
say $var.WHAT;  # (Str)

При наличии ограничения типа тип известен сразу, ещё до присвоения:

my Str $var;
say $var.^name; # Str
say $var.WHAT;  # (Str)

$var = 'Hello';
say $var.^name; # Str
say $var.WHAT;  # (Str)

Сравнение объектов типов

Поскольку WHAT возвращает сам объект типа, два таких объекта можно сравнить оператором тождества значений ===, который проверяет, являются ли обе стороны одним и тем же значением. Для каждого типа существует ровно один объект типа, поэтому это удобный способ проверить, имеют ли два значения одинаковый тип:

my $a = 42;
my $b = 100;

say $a.WHAT === $b.WHAT; # True  — both are Int
say $a.WHAT === Int;     # True
say $a.WHAT === Str;     # False

В отличие от ==, который сравнивает числа, === сравнивает тождественность, поэтому он работает с объектами типов (и другими значениями) напрямую.

Практика

Пройдите 1 тест по содержанию этой темы.

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

Интроспекция с помощью МОП   |   Тест — WHAT и ^name


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