role Enumeration { }

这是 enum 类型 中的枚举对实现的角色。通常,它用于创建常量集,其元素也成为当前命名空间中的常量符号,并建立属于同一集合的符号之间的关系。通常,你会在 enum 类型中找到 Enumeration

enum norse-gods <Þor Oðin Loki>;
my $one-of-them = norse-gods.pick;
say $one-of-them ~~ Enumeration# OUTPUT: «True␤»

但如果你想以某种方式限制键和值之间的关系,没有什么能阻止你在自己的程序中使用它

class DNA does Enumeration {
    my %pairings = %=> "T",
                      => "A",
                      => "G",
                      => "C" );
 
    method new$base-pair where "A" | "C" | "G" | "T" )  {
        self.blesskey => $base-pair,
                    value => %pairings{$base-pair});
    }
 
    multi method gist(::?CLASS:D:{
        return "$!key → $!value";
    }
 
}
 
enum Chain ();
constant length = 16;
for <A C G T>.rolllength ) -> $letter {
    my DNA $base = DNA.new$letter );
    Chain.HOW.add_enum_valueChain$base );
}
 
for ^length {
    my $base = Chain.pick;
    say "{$base.key} and {$base.value}";
}

在此代码中,DNA 使用 Enumeration 角色,从这个角度来看,它是一对键和值;我们可以使用生成的 DNA 对象从 enum 类型中组合一个 enum 类型,其中的元素可以逐个挑选,输出如下所示。

T and A
C and G
T and A
# and so on...

一个项目将智能匹配枚举类,但反过来则不行

enum Foo <bar baz>;
say baz ~~ Foo;  # OUTPUT: «True␤» 
say Foo ~~ bar;  # OUTPUT: «False␤» 

作用于枚举类的函数§

从 Rakudo 编译器的 2021.04 版本开始,枚举类可以被视为一个实例化的 Map 对象。这意味着你可以在枚举类上使用 keysvalueskvpairsantipairsinvert,并获得预期的结果。

enum Norse-gods <Þor Oðin Freija>;
say Norse-gods.keys# OUTPUT: «(Þor Oðin Freija)␤»

方法 enums§

method enums()

返回枚举值的 Map。对枚举类型和任何键都有效。

enum Mass ( mg => 1/1000=> 1/1kg => 1000/1 );
say Mass.enums# OUTPUT: «Map.new((g => 1, kg => 1000, mg => 0.001))␤» 
say g.enums;    # OUTPUT: «Map.new((g => 1, kg => 1000, mg => 0.001))␤»

作用于枚举键的函数§

方法键§

一个 Enumeration 属性。

enum Norse-gods <Þor Oðin Freija>;
say Freija.key# OUTPUT: «Freija␤»

方法值§

这些是 Enumeration 属性。

enum Norse-gods <Þor Oðin Freija>;
say Oðin.value# OUTPUT: «1␤»

valueenum 类型从 0 开始自动分配。Oðin 获得 1,因为它在 enum 中是第二个。

方法 kv§

multi method kv(::?CLASS:D:)

返回一个包含枚举对的键和值的列表。

say g.kv# OUTPUT: «(g 1)␤» 

方法对§

method pair(::?CLASS:D:)

Pair 的形式返回它。

say g.pair# OUTPUT: «g => 1␤» 

方法 CALL-ME§

multi method CALL-ME(|)

给定一个枚举值,返回一个 Enumeration 实例。

enum Mass ( mg => 1/1000=> 1/1kg => 1000/1 );
say Mass(1/1000); # OUTPUT: mg

方法 pick§

multi method pick(::?CLASS:U:)
multi method pick(::?CLASS:U: \n)
multi method pick(::?CLASS:D: *@pos)

它作用于定义的类,选择一个元素并消除它。

say Norse-gods.pick() for ^3;  # OUTPUT: «Þor␤Freija␤Oðin␤» 

方法 roll§

multi method roll(::?CLASS:U:)
multi method roll(::?CLASS:U: \n)
multi method roll(::?CLASS:D: *@pos)

它们在已定义的类上工作,选择一个或n个元素,而不会消除它们。

say Norse-gods.roll() for ^3;  # OUTPUT: «Freija␤Freija␤Oðin␤» 

方法 pred§

method pred(::?CLASS:D:)
say Freija.pred;  # OUTPUT: «Oðin␤» 

方法 succ§

method succ(::?CLASS:D:)
say Oðin.succ;  # OUTPUT: «Freija␤» 

方法 Numeric§

multi method Numeric(::?CLASS:D:)

获取枚举的值,并在强制转换为 Numeric 后返回该值

enum Numbers ( cool => '42'almost-pi => '3.14'sqrt-n-one => 'i' );
say cool.Numeric;       # OUTPUT: «42␤» 
say almost-pi.Numeric;  # OUTPUT: «3.14␤» 
say sqrt-n-one.Numeric# OUTPUT: «0+1i␤»

请注意,如果无法将该值强制转换为 Numeric,则会引发异常。

方法 Int§

multi method Int(::?CLASS:D:)

获取枚举的值,并在强制转换为 Int 后返回该值

enum Numbers ( cool => '42'almost-pi => '3.14'sqrt-n-one => 'i' );
say cool.Int;           # OUTPUT: «42␤» 
say almost-pi.Int;      # OUTPUT: «3␤» 
try say sqrt-n-one.Int;
say $!.message if $!;   # OUTPUT: «Cannot convert 0+1i to Int: imaginary part not zero␤»

请注意,如果无法将该值强制转换为 Int,则会引发异常。

方法 Real§

multi method Real(::?CLASS:D:)

获取枚举的值,并在强制转换为 Real 后返回该值

enum Numbers ( cool => '42'almost-pi => '3.14'sqrt-n-one => 'i' );
say cool.Real;           # OUTPUT: «42␤» 
say almost-pi.Real;      # OUTPUT: «3.14␤» 
try say sqrt-n-one.Real;
say $!.message if $!;    # OUTPUT: «Cannot convert 0+1i to Real: imaginary part not zero␤»

请注意,如果无法将该值强制转换为 Real,则会引发异常。

方法 ===§

multi infix:<===> (Enumeration:D \aEnumeration:D \b)

Enumeration 符号的相等性

say Norse-gods.pick() === Freija for ^3# OUTPUT: «False␤False␤True␤» 

类型图§

Enumeration 的类型关系
raku-type-graph Enumeration Enumeration

展开上面的图表