不可实例;从特征声明中使用可调用变量时可调用

时间:2018-06-09 08:42:38

标签: traits perl6

使用此代码,我正在尝试向子例程添加“日志记录”特征:

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 :(得分:3)

my声明=(或:=)在运行时调用赋值(或绑定)后使用。应用于编译时子声明的特征在编译时运行。因此,在初始化之前,您的特征会调用loggr

BEGIN &loggr = ...

constant &loggr = ...

将允许您的代码进行编译并将事件添加到%store

虽然错误消息读起来像是一个低级错误,如果它特别提到loggr(但也许并不是因为它的低级别)会很好,它会希望现在更有意义:

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

您的代码要求在编译时调用loggr但系统会断定,当 具有相应的Callable类型时,很遗憾,当时它是不可实现的它被要求调用它。