时间扭曲变量初始化?

jak*_*kar 8 variables initialization raku

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

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

say @a;
Run Code Online (Sandbox Code Playgroud)

结果是“有点”预期:

[(Any 0) (Int 1) (Int 2)]
Run Code Online (Sandbox Code Playgroud)

我说“有点”是因为我期望 $n 的第一个值是“未定义”值(Any)。

就像,在产生第一个值 (Any) 之后,随着我们增加 $n(在 $n 的第一个增量之后,我们有一个转换为 Int),赋值中还有一些时间扭曲事件,我们也得到要更改的第一个值。所以我们最终将第一个值设为 0(零)。

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

wam*_*mba 7

Any.pm6#L519,候选人

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

用来。还有一些未定义值的其他候选者,您可以尝试

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

my Num $y;
dd $y++; #0e0
Run Code Online (Sandbox Code Playgroud)