警告:此角色是 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 (:) );say 21.double; # OUTPUT: «42»
方法§
方法 add_method§
method add_method(, , )
向元类添加一个方法,使用名称 $name
调用。这应该只在类型组合之前完成。
方法 methods§
method methods(, :, :)
返回类上可用的公共方法列表(包括来自超类和角色的方法)。默认情况下,这会停止在类 Cool
、Any
或 Mu
;要真正获取所有方法,请使用 :all
副词。如果设置了 :local
,则仅返回直接在类中声明的方法。
say A.^methods(); # xsay A.^methods(:all); # x infinite defined ...
返回的列表包含类型为 Method
的对象,您可以使用它们来内省它们的签名并调用它们。
一些内省方法类似物,如 WHAT
,不会显示,尽管它们存在于任何 Raku 对象中。它们在语法级别处理,并且出于引导原因,它们可能仍然如此。
方法 method_table§
method method_table( --> Hash)
返回一个哈希,其中键是方法名称,值是 Method
。请注意,键是可以调用方法的名称,不一定是方法自己知道的名称。
方法 lookup§
method lookup(, --> Method)
如果未找到方法对象,则返回提供的 $name
的第一个匹配 Method
对象或 (Mu)
。通过遵循 $obj
的 mro 来搜索匹配的方法对象。请注意,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_method
和 lookup
之间的区别在于,find_method
将使用参数化角色的默认候选,而 lookup
在这种情况下会引发异常,并且 find_method
遵守 FALLBACK
方法,而 lookup
则不遵守。