如何在Raku中将字符串列表转换为RDProcDebug枚举列表?
将字符串转换为Raku枚举类型列表的解决方案
问题背景
我在模块AAA中定义了如下枚举与类:
enum RDProcDebug <None All AstBlock BlockType Scoping Templates MarkUp>; class Debug { method foo(RDProcDebug @ds) { for @ds { say .key ~ ' => ' ~ .value } } }
在Raku程序中直接传入枚举值调用方法能正常工作,示例如下:
use AAA; my Debug $r .= new; # 注:原代码中的`$rp`为笔误,应对应类实例 $r.foo(AstBlock, BlockType);
但现在需要从命令行传入枚举名称的字符串(如通过环境变量RDOpts='AstBlock BlockType'),直接传入方法无法正常执行,需将字符串列表转换为RDProcDebug类型的枚举列表。
解决方法
Raku的枚举类型支持通过字符串直接获取对应枚举值,具体实现步骤如下:
- 读取环境变量并分割为字符串列表
- 将每个字符串转换为对应的
RDProcDebug枚举值 - 传入方法完成调用
完整实现代码
use AAA; # 读取环境变量并分割字符串,若未设置则可默认使用None my @str-opts = %*ENV<RDOpts>.split(/\s+/); # 将字符串转换为枚举值,同时过滤无效的枚举名称 my RDProcDebug @enum-opts = @str-opts.map: -> $s { RDProcDebug::($s) if RDProcDebug.enums{$s}:exists }; @enum-opts = grep *.defined, @enum-opts; # 创建实例并调用方法 my Debug $r .= new; $r.foo(@enum-opts);
关键说明
- 使用
RDProcDebug::($s)语法可通过字符串直接匹配对应的枚举成员 RDProcDebug.enums{$s}:exists用于校验字符串是否为有效的枚举名称,避免传入无效值引发异常- 若不需要校验,可简化为
@str-opts.map(&RDProcDebug::),但无效字符串会直接抛出错误
内容的提问来源于stack exchange,提问作者Richard Hainsworth
相关产品推荐
相关产品推荐

