这是 enum
类型 中的枚举对实现的角色。通常,它用于创建常量集,其元素也成为当前命名空间中的常量符号,并建立属于同一集合的符号之间的关系。通常,你会在 enum 类型中找到 Enumeration
<Þor Oðin Loki>;my = norse-gods.pick;say ~~ Enumeration; # OUTPUT: «True»
但如果你想以某种方式限制键和值之间的关系,没有什么能阻止你在自己的程序中使用它
does Enumeration();constant length = 16;for <A C G T>.roll( length ) ->for ^length
在此代码中,DNA
使用 Enumeration
角色,从这个角度来看,它是一对键和值;我们可以使用生成的 DNA
对象从 enum
类型中组合一个 enum
类型,其中的元素可以逐个挑选,输出如下所示。
T and A C and G T and A # and so on...
一个项目将智能匹配枚举类,但反过来则不行
<bar baz>;say baz ~~ Foo; # OUTPUT: «True»say Foo ~~ bar; # OUTPUT: «False»
作用于枚举类的函数§
从 Rakudo 编译器的 2021.04 版本开始,枚举类可以被视为一个实例化的 Map
对象。这意味着你可以在枚举类上使用 keys、values、kv、pairs、antipairs、invert,并获得预期的结果。
<Þor Oðin Freija>;say Norse-gods.keys; # OUTPUT: «(Þor Oðin Freija)»
方法 enums§
method enums()
返回枚举值的 Map
。对枚举类型和任何键都有效。
( mg => 1/1000, g => 1/1, kg => 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
属性。
<Þor Oðin Freija>;say Freija.key; # OUTPUT: «Freija»
方法值§
这些是 Enumeration
属性。
<Þor Oðin Freija>;say Oðin.value; # OUTPUT: «1»
value
由 enum
类型从 0 开始自动分配。Oðin
获得 1,因为它在 enum
中是第二个。
方法 kv§
multi method kv(::?CLASS:)
返回一个包含枚举对的键和值的列表。
say g.kv; # OUTPUT: «(g 1)»
方法对§
method pair(::?CLASS:)
以 Pair
的形式返回它。
say g.pair; # OUTPUT: «g => 1»
方法 CALL-ME§
multi method CALL-ME(|)
给定一个枚举值,返回一个 Enumeration
实例。
( mg => 1/1000, g => 1/1, kg => 1000/1 );say Mass(1/1000); # OUTPUT: mg
方法 pick§
multi method pick(::?CLASS:)multi method pick(::?CLASS: \n)multi method pick(::?CLASS: *)
它作用于定义的类,选择一个元素并消除它。
say Norse-gods.pick() for ^3; # OUTPUT: «ÞorFreijaOðin»
方法 roll§
multi method roll(::?CLASS:)multi method roll(::?CLASS: \n)multi method roll(::?CLASS: *)
它们在已定义的类上工作,选择一个或n
个元素,而不会消除它们。
say Norse-gods.roll() for ^3; # OUTPUT: «FreijaFreijaOðin»
方法 pred§
method pred(::?CLASS:)
say Freija.pred; # OUTPUT: «Oðin»
方法 succ§
method succ(::?CLASS:)
say Oðin.succ; # OUTPUT: «Freija»
方法 Numeric§
multi method Numeric(::?CLASS:)
获取枚举的值,并在强制转换为 Numeric
后返回该值
( 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:)
获取枚举的值,并在强制转换为 Int
后返回该值
( 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:)
获取枚举的值,并在强制转换为 Real
后返回该值
( 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 \a, Enumeration \b)
Enumeration
符号的相等性
say Norse-gods.pick() === Freija for ^3; # OUTPUT: «FalseFalseTrue»