作者:L-壹_413 | 来源:互联网 | 2022-12-02 17:50
以下程序:
use v6.c;
use MONKEY-TYPING;
augment class Any {
method show0 { self.say }}
augment class List {
method show1 { self.say }}
.show0;
.show1;
产生预期的输出:
(hello world)
(hello world)
这一个:
use v6.c;
use MONKEY-TYPING;
augment class Any {
method show0 { self.say }}
.show0;
产生错误:
No such method 'show0' for invocant of type 'List'. Did you mean 'show0'?
in block at showcase.p6 line 9
这是一个错误还是我只是把它弄错了?
1> Elizabeth Ma..:
首先:至少在Rakudo Perl 6的可预见的未来,增加核心课程并不是一个好主意.它不适合预编译.
其次:当一个类是另一个类的子类时,子类"知道"它从哪个继承.唉,这不相反:一个类不知道它的子类(至少在撰写本文时).
这意味着如果你扩充Any
,它的子类都不知道它们也应该重新组合.在您的第一个示例中,您List
通过扩充该类来完成该操作.但是,如果你要颠倒增强的顺序,它也不会起作用,因为在List
重新编写Any
类之前,类会重新组合.
因此,建议将使用角色的任何额外方法混合到一个类中,或者混合到一个对象中(角色的混合)
但通过`$ list.Any :: a-method-added-to-Any`的合格访问应该有效,对吗?
我同意并且文档甚至声明有更好的方法来做同样的事情.我在[Sort :: Naturally](https://github.com/thundergnat/Sort-Naturally)中偶然发现了它,想要玩它.它仍然是相当不直观的`List`有`.show0`取决于调用的顺序.