You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 23:32:39