#enums #raku
#перечисления #raku
Вопрос:
Учитывая перечисление
enum NATO (:alpha<A>, :bravo<B>, :charlie<C>, :delta<D>);
можно легко установить переменную, буквально введя одно из имен или передав одно из значений объекту enum:
my $a = alpha;
my $b = NATO('B');
say $a; # ↪︎ alpha
say $b; # ↪︎ bravo
say $a.value; # ↪︎ A
say $b.value; # ↪︎ B
Помимо использования EVAL
и присвоения Str
значения, соответствующего одному из перечислений, как я мог бы создать $c
значение, эквивалентное перечислению charlie
?
my $x = 'charlie';
my $c = ...
Ответ №1:
Вы можете рассматривать его как хэш:
my $c = NATO::{$x};
Комментарии:
1. Ах, мне нужно было двойное двоеточие. Я определенно пытался просто использовать
NATO{$x}
безрезультатно. Спасибо за отличный альтернативный ответ (он длиннее, чем у @ugexe, но для ситуаций, когда::($x)
не будет очевидно, что происходит,Foo::{$x}
сделает его кристально ясным.2. @guifa в конце
::
отображается таблица символов, в которой находятся все элементы перечисления. Вот почемуNATO::{...}
работает.
Ответ №2:
Вы можете использовать косвенный поиск по имени:
enum NATO (:alpha<A>, :bravo<B>, :charlie<C>);
my $x = 'charlie';
my $c = ::($x);
say $c.value;