重写方法调用操作符或其他一些方法来捕获方法名称解析错误

时间:2018-05-24 07:33:42

标签: oop perl6 dispatch

我正在尝试为X::NYI类编写一个示例作为对this issue的回复。我想出了类似的东西:

class Nothing {
    sub postfix:<.&>( $sub, **@args) {
        die X::NYI.new( feature => $sub,
                        did-you-mean => "nothing",
                        workaround => "Implement it yourself" );
    }
}

my $let's-see = Nothing.newish;

尝试重新实现the method call postfix operator以便为所调用的任何内容抛出异常。这不起作用:

No such method 'newish' for invocant of type 'Nothing'

在NYI.p6第13行的街区

事实上,文档说:

  

从技术上讲,不是真正的运营商;它的语法特殊于编译器。

这很可能意味着它无法被覆盖。这也意味着做我想做的事情意味着与metamodel交互以拦截类解析方法。但我真的不知道如何做到这一点。 Rakudo源代码中的大多数示例(例如this one)在调用具体函数时抛出异常,事实上,the exception we see is thrown by the dispatch method at the Mu level

那么覆盖dispatch是否是正确的方法来做这种事情?还是别的什么完全不同?

1 个答案:

答案 0 :(得分:8)

感觉我想要Mockito.verify(mockedA).add("2");

https://docs.perl6.org/language/typesystem#index-entry-FALLBACK_%28method%29

将转换为:

FALLBACK

请注意,我还使用了class Nothing { method FALLBACK($name, |c) is hidden-from-backtrace { die X::NYI.new( feature => $name, did-you-mean => "nothing", workaround => "Implement it yourself" ); } } my $a = Nothing.newish; ============================ newish not yet implemented. Sorry. Did you mean: nothing? Workaround: Implement it yourself in block <unit> at file line 10 特征来确保回溯中未提及is hidden-from-backtrace方法。