如何用Z=>结合变量构造Raku字符串类型枚举?
Raku字符串类型枚举构造问题
正常运行的写法
直接使用字面量序列构造字符串枚举可正常执行:
my Str enum E ( <a b c> Z=> 'one', 'two', 'three' ); E.kv.raku.say;
输出结果:
("c", "three", "a", "one", "b", "two").Seq
无法运行的写法
使用普通数组变量构造枚举会触发报错:
my Str @a = <a b c>; my Str @b = <one two three>; my Str enum F ( @a Z=> @b ); F.kv.raku.say;
报错信息:
No values supplied to enum (does @a Z=> @b need to be declared constant?)
测试性尝试的写法
使用标量变量展开构造,结果不符合预期:
my $a = <a b c>; my $b = <one two three>; my Str enum G ( $a<> Z=> $b<>.map( { .Str } ) ); G.kv.raku.say;
输出结果:
("", "").Seq
问题说明
这种用普通变量构造枚举的方式确实不被支持。核心原因是Raku的枚举定义要求初始化参数必须是编译时常量:枚举的成员结构与值需要在编译阶段就确定,而my声明的普通变量要到运行阶段才会被赋值,编译阶段这些变量还没有有效数据,因此无法用来构造枚举。
如果要通过变量实现类似需求,需将变量声明为constant,确保其值在编译阶段就被确定,示例如下:
constant @a = <a b c>; constant @b = <one two three>; my Str enum F ( @a Z=> @b ); F.kv.raku.say;
执行后会得到与第一个示例一致的输出。
内容的提问来源于stack exchange,提问作者zjmarlow
相关产品推荐
相关产品推荐

