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