使用此代码,我正在尝试向子例程添加“日志记录”特征:
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
错误?
答案 0 :(得分:3)
在my
声明=
(或:=
)在运行时调用赋值(或绑定)后使用。应用于编译时子声明的特征在编译时运行。因此,在初始化之前,您的特征会调用loggr
。
BEGIN &loggr = ...
或
constant &loggr = ...
将允许您的代码进行编译并将事件添加到%store
。
虽然错误消息读起来像是一个低级错误,如果它特别提到loggr
(但也许并不是因为它的低级别)会很好,它会希望现在更有意义:
===SORRY!=== Error while compiling ...
Cannot invoke this object (REPR: Uninstantiable; Callable)
您的代码要求在编译时调用loggr
但系统会断定,当 具有相应的Callable
类型时,很遗憾,当时它是不可实现的它被要求调用它。