Переопределение оператора вызова метода или другой способ отловить ошибки разрешения имени метода - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь написать пример для класса X::NYI в ответ на эту проблему .Я придумал что-то вроде этого:

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;

, который пытается переопределить постфиксный оператор вызова метода , чтобы вызвать исключение для всего, что вызывается.Это не работает:

No such method 'newish' for invocant of type 'Nothing'

в блоке на NYI.p6, строка 13

И, фактически, документация гласит:

Технически, а нереальный оператор;это специальный синтаксис в компиляторе.

Что, скорее всего, означает, что его нельзя переопределить.Это также означает, что выполнение того, что я хочу, подразумевает взаимодействие с метамоделью для перехвата метода разрешения класса.Но я не понимаю, как это можно сделать.Большинство примеров в источнике Rakudo, таких как этот , генерируют исключение при вызове конкретной функции, и, на самом деле, исключение, которое мы видим, выдается методом dispatch в Mu уровень .

Так будет ли переопределение dispatch правильным способом делать подобные вещи?Или что-то еще совершенно другое?

1 Ответ

0 голосов
/ 24 мая 2018

Мне кажется, что вы хотите FALLBACK:

https://docs.perl6.org/language/typesystem#index-entry-FALLBACK_%28method%29

, что означает:

class Nothing {
    method FALLBACK($name, |c) is hidden-from-backtrace {
        die X::NYI.new( feature => $name,
                        did-you-mean => "nothing",
                        workaround => "Implement it yourself" );
    }
}

my $a = Nothing.newish;
============================
newish not yet implemented. Sorry.
Did you mean: nothing?
Workaround: Implement it yourself
  in block <unit> at file line 10

Обратите внимание, что я также использовал is hidden-from-backtraceпризнак того, что метод FALLBACK не упоминается в обратном следе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...