Курс Raku / Розширені / Контейнери / Інтроспекція контейнерів

Використання WHAT

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  — обидва Int
say $a.WHAT === Int;     # True
say $a.WHAT === Str;     # False

На відміну від ==, який порівнює числа, === порівнює тотожність, тож він працює безпосередньо з об’єктами типу (та іншими значеннями).

Практика

Виконайте 1 тест за змістом цієї теми.

Навігація курсом

Інтроспекція контейнерів   |   Тест — WHAT та ^name


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