does Metamodel::Namingdoes Metamodel::Documentingdoes Metamodel::Versioningdoes Metamodel::Stashingdoes Metamodel::AttributeContainerdoes Metamodel::MethodContainerdoes Metamodel::PrivateMethodContainerdoes Metamodel::MultiMethodContainerdoes Metamodel::RoleContainerdoes Metamodel::MultipleInheritancedoes Metamodel::DefaultParentdoes Metamodel::C3MROdoes Metamodel::MROBasedMethodDispatchdoes Metamodel::MROBasedTypeCheckingdoes Metamodel::Trustingdoes Metamodel::BUILDPLANdoes Metamodel::Mixinsdoes Metamodel::ArrayTypedoes Metamodel::BoolificationProtocoldoes Metamodel::REPRComposeProtocoldoes Metamodel::Finalization
警告:此类是 Rakudo 实现的一部分,不属于语言规范。
Metamodel::ClassHOW
是 class
关键字背后的元类。
say so Int.HOW ~~ Metamodel::ClassHOW; # OUTPUT: «True»say Int.^methods(:all).pick.name; # OUTPUT: «random Int method name»
方法§
方法 add_fallback§
method add_fallback(, , )
安装方法后备,即添加一种调用未静态添加的方法的方法。
$condition
和 $calculator
都必须是可调用对象,一旦调用了方法缓存中找不到的方法,它们就会接收调用者和方法名称。
如果 $condition
返回真值,则使用相同的参数调用 $calculator
,并且必须返回要作为方法调用的代码对象,并将其添加到方法缓存中。
如果 $condition
返回假值,则尝试下一个后备(如果有),如果都不匹配,则抛出 类型为 X::Method::NotFound 的异常。
面向用户的代码(即不涉及元类的代码)应该使用 FALLBACK
方法。
方法 can§
method can(, )
给定一个方法名称,它返回一个 List
,其中列出了可以使用此名称的方法。
;is A ;say B.^can('x').elems; # OUTPUT: «2»for B.^can('x')
在此示例中,类 B
有两个可以使用名称 x
的可能方法(尽管普通方法调用只会调用直接安装在 B
中的方法)。B
中的方法具有元数 1(即它期望一个参数,即调用者(self
)),而 A
中的方法期望 2 个参数(self
和 $a
)。
方法 lookup§
method lookup(, --> Method)
返回第一个匹配的 Method
,其名称已提供。如果未找到方法,则返回特定于 VM 的哨兵值(通常是低级 NULL 值),可以使用 定义性 测试对此值进行测试。它可能比 .^can
更快,但不会提供所有候选者的完整列表。
say Str.^lookup('Int').raku; # OUTPUT: «method Int (Str:D $: *%_) { #`(Method|39910024) ... }»for <upper-case uc># OUTPUT:# method `upper-case` not found# FOO
方法 compose§
method compose()
调用 compose
会使元对象及其表示的类进入完全功能状态,因此,如果你构造或修改了一个类,则必须在使用该类之前调用 compose 方法。
它会更新方法缓存,检查角色所需的所有方法是否已实现,执行实际的角色组合工作,并设置类以与语言互操作性配合良好。
方法 new_type§
method (:, : = 'P6opaque', :, :)
从元模型创建新类型,我们可以继续构建
my = Metamodel::ClassHOW.new_type(name => "NewType",ver => v0.0.1,auth => 'github:raku' );.HOW.add_method(,"hey", method );.hey; # OUTPUT: «Hey».HOW.compose();my = .new;.hey; # OUTPUT: «Hey»
我们通过使用高阶工作方法添加单个方法,然后我们可以直接将该方法用作类方法;然后我们可以组合
类型,之后我们可以创建一个实例,该实例的行为方式完全相同。