以下程序:
use v6.c;
use MONKEY-TYPING;
augment class Any {
method show0 { self.say }}
augment class List {
method show1 { self.say }}
<hello world>.show0;
<hello world>.show1;
Run Code Online (Sandbox Code Playgroud)
产生预期的输出:
(hello world)
(hello world)
Run Code Online (Sandbox Code Playgroud)
这一个:
use v6.c;
use MONKEY-TYPING;
augment class Any {
method show0 { self.say }}
<hello world>.show0;
Run Code Online (Sandbox Code Playgroud)
产生错误:
No such method 'show0' for invocant of type 'List'. Did you mean 'show0'?
in block <unit> at showcase.p6 line 9
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是我只是把它弄错了?
Eli*_*sen 10
首先:至少在Rakudo Perl 6的可预见的未来,增加核心课程并不是一个好主意.它不适合预编译.
其次:当一个类是另一个类的子类时,子类"知道"它从哪个继承.唉,这不相反:一个类不知道它的子类(至少在撰写本文时).
这意味着如果你扩充Any,它的子类都不知道它们也应该重新组合.在您的第一个示例中,您List通过扩充该类来完成该操作.但是,如果你要颠倒增强的顺序,它也不会起作用,因为在List重新编写Any类之前,类会重新组合.
因此,建议将使用角色的任何额外方法混合到一个类中,或者混合到一个对象中(角色的混合)