Как правильно увеличить Any? - PullRequest
0 голосов
/ 09 октября 2018

Следующая программа:

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;

выдает ожидаемый результат:

(hello world)
(hello world)

В то время как эта:

use v6.c;

use MONKEY-TYPING;

augment class Any {
    method show0 { self.say }}

<hello world>.show0;

выдает ошибку:

No such method 'show0' for invocant of type 'List'. Did you mean 'show0'?
  in block <unit> at showcase.p6 line 9

Это ошибка или я просто ошибаюсь?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Сводка различных комментариев здесь и по проблеме, которую я создал на Github:

Как упоминала Лиз в настоящее время, типы детей не видят увеличения своих родителей.Это верно, если не было очистки кэша методов для этого типа.

Это поведение является известным ограничением, которое будет исправлено через некоторое время с низким приоритетом.

Восстановление классас .^compose может использоваться для того, чтобы расширенные методы были известны детям:

use v6.c;

use MONKEY-TYPING;

augment class Any {
    method show0 { self.say }}

List.^compose;

<hello world>.show0; # OUTPUT: (hello world)

В качестве альтернативы доступ к квалифицированному классу можно получить напрямую:

use v6.c;

use MONKEY-TYPING;

augment class Any {
    method show0 { self.say }}

<hello world>.Any::show0; # OUTPUT: (hello world)
0 голосов
/ 09 октября 2018

Прежде всего: расширение базовых классов, по крайней мере в обозримом будущем Rakudo Perl 6, - не хорошая идея.Он плохо работает с прекомпиляцией.

Во-вторых: когда класс является подклассом другого класса, подкласс "знает", от чего он наследует.Увы, это не работает наоборот: класс не знает своих подклассов (по крайней мере, на момент написания этой статьи).

Это означает, что если вы увеличиваете Any, то ни один из егоПодклассы знают, что должны также заново составить себя.В первом примере вы делаете это с помощью класса List, увеличивая его.Однако, если вы измените порядок дополнений, он также не будет работать, потому что класс List будет перекомпонован до того, как класс Any будет перекомпонован.

Поэтомурекомендуется смешивать любые дополнительные методы с использованием ролей либо в классе, либо в объекте ( смесь ролей )

...