在角色 Metamodel::MethodContainer 中§

有关方法查找,请参阅主要文档 在上下文中

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 则不尊重。

在 Metamodel::ClassHOW 中§

有关方法查找,请参阅主要文档 在上下文中

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

返回具有提供名称的第一个匹配 Method。如果未找到方法,则返回一个特定于 VM 的哨兵值(通常是一个低级别的 NULL 值),可以用对 definedness 的测试进行测试。它可能比 .^can 更快,但不会提供所有候选的完整列表。

    say Str.^lookup('Int').raku# OUTPUT: «method Int (Str:D $: *%_) { #`(Method|39910024) ... }␤» 
 
    for <upper-case  uc> {
        Str.^lookup: $^meth andthen .("foo").say
            orelse "method `$meth` not found".say
    }
    # OUTPUT: 
    # method `upper-case` not found 
    # FOO