【发布时间】:2018-05-24 07:33:41
【问题描述】:
我正在尝试为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 是做这种事情的正确方法吗?还是其他完全不同的东西?
【问题讨论】:
-
Afaict 你已经排序了,因为 Lizmat 提供了一个很好的答案,你已经接受了它并关闭了文档问题。此评论提醒您或未来的读者,他们正在考虑尝试让您的
postfix:<.&>方法发挥作用。我可以看到你在想什么,但到目前为止你的尝试在多个方面都被打破了。有些是可以修复的,但总的来说它不能工作,因为它与 P6 的语法不兼容。这就是为什么它是特殊情况。如果007 演变为涵盖此案例并重新合并到未来的 P6 中,Aiui 有朝一日可能会实现。 -
(在some discussion at the 007 project 之后,作为一种覆盖方法调用运算符的方法,俚语可能比宏更好。)