如何在Raku中以编程方式获取枚举的所有可能值?
如何在Raku中以编程方式获取枚举的所有可能值?
嗨,我之前也碰到过和你一样的困扰——不想手动重复写枚举的成员列表,想通过代码动态获取所有可能的枚举值。你提到的.enums方法确实只返回一个Map,键是成员的字符串名称,值是它们对应的底层数值(因为默认是整数枚举),这显然不是你需要的枚举值本身。不过Raku的枚举类型通过元类方法提供了完美的解决方案:
如果你需要实际的枚举成员对象(比如
Direction::north这种可以直接使用的枚举值实例),直接调用枚举类型的.^values方法就可以:enum Direction <north east south west>; # 动态获取所有枚举值并遍历 for Direction.^values -> $dir { say $dir; # 会依次输出 north、east、south、west # 要是需要访问对应的底层数值,还可以写:say $dir.value; }如果你只是需要枚举成员的字符串名称,那
Direction.enums.keys就能拿到("north", "east", "south", "west")这个列表;如果之后要把名称转换成对应的枚举对象,用::($name)就能实现:for Direction.enums.keys -> $name { my $dir = ::($name); say $dir; }
另外还有个等价的元类方法.^enum-members,它返回的也是所有枚举成员对象的列表,用法和.^values完全一致,比如:
for Direction.^enum-members -> $dir { say $dir; }
这两种方法都能帮你彻底摆脱手动重复枚举成员的麻烦,完全动态获取所有可能的枚举值~
备注:内容来源于stack exchange,提问作者mscha
相关产品推荐
相关产品推荐

