Создание перечисления из его имени, а не значения

#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;