Uninstantiable;Вызывается при использовании переменных Callable из объявления черты - PullRequest
0 голосов
/ 09 июня 2018

С помощью этого кода я пытаюсь добавить черту «ведения журнала» в подпрограмму:

my &loggr = -> $event {
    state %store;
    %store{ DateTime.new( now ) } = $event;
}

multi sub trait_mod:<is>(Sub $s, :$logger){
    loggr( $s.name );
}

multi sub add( Int $a, Int $b) is logger {
    $a + $b;
}

say add(1,2);

Однако я получаю ошибку:

===SORRY!=== Error while compiling /home/jmerelo/Code/perl6/my-perl6-examples/is-logger-fail.p6
Cannot invoke this object (REPR: Uninstantiable; Callable)
at /home/jmerelo/Code/perl6/my-perl6-examples/is-logger-fail.p6:14

(строка 14будет строкой, в которой объявлено add).Объявление loggr напрямую как подпрограмма не приводит к ошибке.Почему я получаю эту Uninstantiable ошибку здесь?

1 Ответ

0 голосов
/ 09 июня 2018

При использовании после объявления my = (или :=) вызывает присвоение (или привязку) во время выполнения.Черта, примененная к вложенному объявлению времени компиляции, выполняется во время компиляции.Таким образом, ваша черта вызывает loggr до инициализации.

BEGIN &loggr = ...

или

constant &loggr = ...

позволит вашему коду скомпилировать и добавить событие в ваш %store.

Хотя сообщение об ошибке читается как ошибка низкого уровня, и было бы неплохо, если бы в нем было конкретно упомянуто loggr (но, возможно, нет, потому что это низкоуровневое), мы надеемся, что теперь оно будет иметь больше смысла:

===SORRY!=== Error while compiling ...
Cannot invoke this object (REPR: Uninstantiable; Callable)

Ваш код попросил вызвать loggr во время компиляции, но система приходит к выводу, что, хотя он имеет , имеет соответствующий тип Callable, он, к сожалению, нереализуем в тот момент, когда онпросят вызвать его.

...