role Metamodel::MethodContainer {}

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

角色、类、语法和枚举可以包含方法。此角色实现了存储和内省它们周围的 API。

say .name for Int.^methods(:all);
 
# don't do that, because it changes type Int globally. 
# just for demonstration purposes. 
Int.^add_method('double'method ($x:{ 2 * $x });
say 21.double# OUTPUT: «42␤»

方法§

方法 add_method§

method add_method($obj$name$code)

向元类添加一个方法,使用名称 $name 调用。这应该只在类型组合之前完成。

方法 methods§

method methods($obj:$all:$local)

返回类上可用的公共方法列表(包括来自超类和角色的方法)。默认情况下,这会停止在类 CoolAnyMu;要真正获取所有方法,请使用 :all 副词。如果设置了 :local,则仅返回直接在类中声明的方法。

class A {
    method x() { };
}
 
say A.^methods();                   # x 
say A.^methods(:all);               # x infinite defined ...

返回的列表包含类型为 Method 的对象,您可以使用它们来内省它们的签名并调用它们。

一些内省方法类似物,如 WHAT,不会显示,尽管它们存在于任何 Raku 对象中。它们在语法级别处理,并且出于引导原因,它们可能仍然如此。

方法 method_table§

method method_table($obj --> Hash:D)

返回一个哈希,其中键是方法名称,值是 Method。请注意,键是可以调用方法的名称,不一定是方法自己知道的名称。

方法 lookup§

method lookup($obj$name --> Method)

如果未找到方法对象,则返回提供的 $name 的第一个匹配 Method 对象或 (Mu)。通过遵循 $objmro 来搜索匹配的方法对象。请注意,lookup 应该用于内省,如果您想要可以调用的东西,您可能希望改用 find_method

say 2.5.^lookup("sqrt").raku;      # OUTPUT: «method sqrt (Rat $: *%_) ...␤» 
say Str.^lookup("BUILD").raku;     # OUTPUT: «submethod BUILD (Str $: :$value = "", *%_ --> Nil) ...␤» 
say Int.^lookup("does-not-exist"); # OUTPUT: «(Mu)␤»

find_methodlookup 之间的区别在于,find_method 将使用参数化角色的默认候选,而 lookup 在这种情况下会引发异常,并且 find_method 遵守 FALLBACK 方法,而 lookup 则不遵守。