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