从名称而不是值创建枚举

11

考虑到枚举类型

enum NATO (:alpha<A>, :bravo<B>, :charlie<C>, :delta<D>);

可以通过直接输入名称之一或将一个值传递给枚举对象来轻松设置变量:

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个回答

12

你可以将其视为哈希表:

my $c = NATO::{$x};

1
啊,我需要双冒号。我肯定已经尝试过只使用NATO{$x}但是没有成功。感谢提供一个很好的替代答案(虽然比@ugexe的答案长,但在::($x)无法清楚表达意思的情况下,Foo::{$x}会让一切变得明朗易懂)。 - user0721090601
3
@guifa,末尾的::会给出符号表,其中包含所有枚举项。这就是为什么 NATO::{...} 可以工作的原因。 - moritz

8
您可以使用间接名称查找:
enum NATO (:alpha<A>, :bravo<B>, :charlie<C>);
my $x = 'charlie';
my $c = ::($x);
say $c.value;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接