class Metamodel::EnumHOW
        does Metamodel::Naming
        does Metamodel::Documenting
        does Metamodel::Stashing
        does Metamodel::AttributeContainer
        does Metamodel::MethodContainer
        does Metamodel::MultiMethodContainer
        does Metamodel::RoleContainer
        does Metamodel::BaseType
        does Metamodel::MROBasedMethodDispatch
        does Metamodel::MROBasedTypeChecking
        does Metamodel::BUILDPLAN
        does Metamodel::BoolificationProtocol
        does Metamodel::REPRComposeProtocol
        does Metamodel::Mixins
            { }

警告:此类是 Rakudo 实现的一部分,不属于语言规范。

Metamodel::EnumHOWenum 关键字背后的元类。

enum Numbers <1 2>;
say Numbers.HOW ~~ Metamodel::EnumHOW# OUTPUT: «True␤»

以下枚举声明

our Int enum Error <Warning Failure Exception Sorrow Panic>;

大致等效于使用 Metamodel::EnumHOW 方法编写的以下代码

BEGIN {
    my constant Error = Metamodel::EnumHOW.new_type: :name<Error>:base_type(Int);
    Error.^add_role: Enumeration;
    Error.^add_role: NumericEnumeration;
    Error.^compose;
    for <Warning Failure Exception Sorrow Panic>.kv -> Int $vStr $k {
        # Note: Enumeration.pred and .succ will not work when adding enum 
        # values as pairs. They should be instances of the enum itself, but 
        # this isn't possible to do without nqp. 
        Error.^add_enum_value: $k => $v;
        OUR::{$k} := Error.^enum_from_value: $v;
    }
    Error.^compose_values;
    OUR::<Error> := Error;
}

方法§

方法 new_type§

method new_type(:$name!:$base_type?:$repr = 'P6opaque':$is_mixin)

为枚举创建一个新的类型对象。$name 是枚举名称,$base_type 是在使用范围声明声明枚举时给出的类型(如果有),$repr 是使用 repr 特征传递给枚举的类型表示形式。$is_mixin 未使用。

方法 add_parent§

method add_parent($obj$parent)

设置枚举的基本类型。仅当没有将基本类型传递给 .new_type 时才能使用此方法。

方法 set_export_callback§

method set_export_callback($obj$callback)

设置枚举的导出回调,在调用 .compose_values 时调用此回调。在将 export 特征应用于枚举时调用此回调。$callback 应为某种例程,不带参数,用于处理枚举值的导出。

方法 export_callback§

method export_callback($obj)

返回由 .set_export_callback 设置的导出回调。

方法 compose§

method compose($obj:$compiler_services)

完成枚举的类型对象。这是枚举执行的任何角色混合在一起的时候。需要在使用 .add_enum_value 添加任何枚举值之前调用此方法。

方法 is_composed§

method is_composed($obj)

如果枚举已组合,则返回 1,否则返回 0。

方法 compose_values§

method compose_values($obj)

调用由 .set_export_callback 设置的导出回调并将其从状态中删除。在使用 .add_enum_value 添加枚举值后应调用此方法。

方法 set_composalizer§

method set_composalizer($c)

设置枚举的组合器,它生成可以与另一个混合的类型。$c 应为具有以下签名的某些例程

:($type$name@enum_values)

方法 composalizer§

method composalizer($obj)

返回由 .set_composalizer 设置的组合器。

方法 add_enum_value§

method add_enum_value($obj$value)

向此枚举添加一个值。$value 应为枚举本身的一个实例,类型为 Enumeration

方法 enum_values§

method enum_values($obj)

返回枚举的值。

enum Numbers <10 20>;
say Numbers.^enum_values;                   # OUTPUT: {10 => 0, 20 => 1}

方法 elems§

method elems($obj)

返回值的数量。

enum Numbers <10 20>;
say Numbers.^elems;                         # OUTPUT: 2

方法 enum_from_value§

method enum_from_value($obj$value)

给定枚举基本类型的值,返回相应的枚举。

enum Numbers <10 20>;
say Numbers.^enum_from_value(0);            # OUTPUT: 10

方法 enum_value_list§

method enum_value_list($obj)

返回枚举值列表。

enum Numbers <10 20>;
say Numbers.^enum_value_list;               # OUTPUT: (10 20)