Создание перечисления из его имени, а не значения - PullRequest
10 голосов
/ 20 апреля 2019

Учитывая перечисление

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 =  ...

Ответы [ 2 ]

11 голосов
/ 20 апреля 2019

Вы можете рассматривать это как хэш:

my $c = NATO::{$x};
7 голосов
/ 20 апреля 2019

Вы можете использовать косвенный поиск имени:

enum NATO (:alpha<A>, :bravo<B>, :charlie<C>);
my $x = 'charlie';
my $c = ::($x);
say $c.value;
...