Курс по 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  — both are Int
say $a.WHAT === Int;     # True
say $a.WHAT === Str;     # False

За разлика от ==, който сравнява числа, === сравнява идентичност, така че работи директно с типови обекти (и други стойности).

Практика

Направете 1 тест върху съдържанието на тази тема.

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

Интроспекция на контейнери   |   Тест — WHAT и ^name


💪 Или преминете направо към упражненията в този раздел.