时间扭曲变量初始化?

Time Warping Variable Initialization?

在下面的简单 for 循环中,我们通过递增无类型变量 ($n) 创建了一个数组 (@a):

my @a = do for 1..3 {
    state $n;
    $n.^name, $n++;
}

say @a;

预期的结果是"kind of":

[(Any 0) (Int 1) (Int 2)]

我说 "kind of" 因为我期望 "undefined" 值(任意)作为 $n 的第一个值。

这就像,在生成第一个值 (Any) 之后,随着我们递增 $n(在 $n 的第一次递增之后,我们将转换为 Int),在赋值,我们也得到第一个要改变的值。所以我们最终将第一个值为 0(零)。

有人可以解释这种行为的确切机制吗?

Any.pm6#L519,候选人

multi sub postfix:<++>(Mu:U $a is rw) { $a = 1; 0 }

已使用。 还有一些未定义值的候选,你可以试试

my Bool $x; 
dd $x++; #Bool::False

my Num $y;
dd $y++; #0e0