gpt4 book ai didi

traits - 不可实例化;使用特征声明中的可调用变量时可调用

转载 作者:行者123 更新时间:2023-12-01 01:44:46 24 4
gpt4 key购买 nike

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

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直接作为 sub 不会产生错误。为什么我会收到这个 Uninstantiable这里有错误?

最佳答案

Why am I getting this Uninstantiable error here?


my 之后使用时声明, = (或 := )在运行时调用赋值(或绑定(bind))。应用于编译时子声明的特征在编译时运行,这是第一个。所以你的特质调用 loggr在它初始化之前。
要解决这个问题,您需要将变量初始化转移到编译时,例如:
BEGIN &loggr = ...
或者
constant &loggr = ...

虽然错误消息读起来像是一个低级错误,但如果它特别提到 loggr 就好了。 (但也许不是因为它是低级的),现在希望它更有意义:
===SORRY!=== Error while compiling ...
Cannot invoke this object (REPR: Uninstantiable; Callable)
您的代码要求调用 loggr在编译时。但是虽然它确实有合适的 Callable类型,它还没有被初始化,所以在被要求调用它的时候是不可实例化的。

关于traits - 不可实例化;使用特征声明中的可调用变量时可调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50772457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com