如何正确增加任何?

mat*_*ull 7 perl6

以下程序:

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类之前,类会重新组合.

因此,建议将使用角色的任何额外方法混合到一个类中,或者混合到一个对象中(角色的混合)

  • 但通过`$ list.Any :: a-method-added-to-Any`的合格访问应该有效,对吗? (3认同)
  • 我同意并且文档甚至声明有更好的方法来做同样的事情.我在[Sort :: Naturally](https://github.com/thundergnat/Sort-Naturally)中偶然发现了它,想要玩它.它仍然是相当不直观的`List`有`.show0`取决于调用的顺序. (2认同)