gpt4 book ai didi

raku - 添加两个共享相同标识符的枚举

转载 作者:行者123 更新时间:2023-12-03 16:54:47 44 4
gpt4 key购买 nike

是否可以在 raku 中定义两个共享相同标识符的枚举?
例如,如果我有以下代码:

#!/usr/bin/raku
use v6;

enum Color <Red Blue>;
enum TrafficLight <Red Green>;

sub MAIN(
Color:D :c(:$color)!, #= the color
TrafficLight:D :t(:$traffic-light)!, #= the traffic-light
) {
say "Selected $color, Selected $traffic-light"
}
您可以在这里看到,标识符 Red 是枚举颜色和枚举 TrafficLight 的一部分。
但是当我执行这个脚本时,我得到了重新声明异常:
$ ./test.p6
Potential difficulties:
Redeclaration of symbol 'Red'
at /home/martin/mnt/release-notes/./scripts/test.p6:5
------> enum TrafficLight <Red Green>⏏;

Usage:
./scripts/test.p6 -c|--color=<Color> (Blue Red) -t|--traffic-light=<TrafficLight> (Green Red)

-c|--color=<Color> (Blue Red) the color
-t|--traffic-light=<TrafficLight> (Green Red) the traffic-light
有趣的是,当我使用参数 -c=Blue and -t=Red 执行此脚本时,输出是我所期望的:
$ ./test.p6 -c=Blue -t=Red
Potential difficulties:
Redeclaration of symbol 'Red'
at /home/martin/mnt/release-notes/./scripts/test.p6:5
------> enum TrafficLight <Red Green>⏏;
Selected Blue, Selected Red
但是当我使用参数 -c=Red and -t=Green 执行这个脚本时,它根本不起作用并返回错误代码 2(显示帮助消息)。
我现在的问题是:
  • 是否可以定义两个具有相同名称(但类型不同)的相同枚举标识符。也许可以用 namespace 定义一个类似于 C++ 中的类枚举的枚举。包围他们?
  • 是否有可能以某种方式捕获此异常?

  • 谢谢

    最佳答案

    问题是枚举在其范围内创建符号。你的代码

    enum Color <Red Blue>;
    enum TrafficLight <Red Green>;
    基本上是在做
    my \Color = Map.new(Red => 0, Blue => 1) does Enumeration;
    my \Red := Color<Red>;
    my \Blue := Color<Blue>;

    my \Traffic-Light = Map.new(Red => 0, Green => 1) does Enumeration;
    my \Red := Traffic-Light<Red>;
    my \Green := Traffic-Light<Green>;
    因此,您可以看到产生警告的原因——您不能再创建符号两次,而不能声明 $x。在同一范围内两次。尽管如此,这两个枚举类仍然存在,并且可以从字符串“Red”创建值。我在这种情况下使用的一种解决方案是创建一个包并调用包内的枚举: Enum
    package Color        {  enum Enum <Red Blue>   }
    package TrafficLight { enum Enum <Red Green> }

    sub MAIN(
    Color::Enum:D :c(:$color )!, #= the color
    TrafficLight::Enum:D :t(:$traffic-light)!, #= the traffic-light
    ) {
    say "Selected $color, Selected $traffic-light"
    }
    如果你想匹配这些值,那么你只需说 Color::RedTrafficLight::Green , 或者如果你将东西存储在一个模块中以便你可以 use , 你仍然可以只使用 RedGreen ,只是不在同一个范围内。所以你可以这样做:
    sub MAIN(
    Color::Enum:D :c(:$color )!, #= the color
    TrafficLight::Enum:D :t(:$traffic-light)!, #= the traffic-light
    ) {
    say "Selected $color, Selected $traffic-light"

    { # new scope
    use MyEnums::Color;
    given $color {
    when Red { ... }
    when Green { ... }
    }
    }

    { # separate new scope
    use MyEnums::TrafficLight;
    ...
    }
    }

    关于raku - 添加两个共享相同标识符的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64142038/

    44 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com