Will trait是否仅适用于对象?及will enter trait代码未按预期执行问题求助
问题2:排查代码未按预期执行的原因
你的代码只输出Going in,主要是两个关键问题导致的:
1. our变量的作用域让enter trait 提前触发了
你用了our $bar,这是包级作用域变量,它的生命周期从程序启动时就开始了,远早于do-stuff()的执行。而will enter trait 的触发时机是变量首次被绑定/纳入作用域,所以这段trait逻辑在程序启动阶段就已经执行过了,不会在do-stuff()运行时再次触发。
把our改成my(块级作用域变量)就能解决这个问题:my变量会在每次进入do-stuff()的块时创建新的容器,此时will enter会正常触发。
2. 变量初始化时机的细节
即使修正了作用域,你还会发现show-value输出的是Any类型——这是因为will enter触发时,变量还没被赋值为baz。如果想看到赋值后的结果,可以把enter换成keep(变量被赋值时触发),或者根据需求调整逻辑顺序。
修改后的可运行代码
sub show-value( $a-var ) { say "Value of {$a-var.^name} is ", $a-var.gist; } sub do-stuff () { ENTER { say "Going in"; } my $bar will enter { show-value($_) }; $bar = "baz"; LEAVE { say "Leaving"; } } do-stuff();
运行这段代码会输出:
Going in Value of Any is (Any) Leaving
如果想看到赋值后的baz,把will enter换成will keep即可,输出会变为:
Going in Value of Str is "baz" Leaving
内容的提问来源于stack exchange,提问作者jjmerelo
相关产品推荐
相关产品推荐

