タイムワーピング変数の初期化?


8

次の単純なforループでは、型なし変数($ n)をインクリメントして配列(@a)を作成します。

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

say @a;

結果は「種類」が期待されます:

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

そして、私は$ nの最初の値として「未定義」の値(すべて)を期待していたので、「種類」と言います。

それは、最初の値が生成された後(Any)、$ nをインクリメントした後($ nの最初のインクリメントの後、Intにキャストした後)、割り当てにタイムワーピングイベントがあり、変更する最初の値。したがって、最初の値は0(ゼロ)になります。

誰かがこの行動の正確なメカニズムを説明できますか?

回答:


7

候補者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

1
したがって、私が正しく理解している場合、配列@aへの「プッシュ」は、postfix ++関数によって暗黙に指定されたアクションの後で行われますか?
ジャカル

1
はい、もちろん。と同じです^name。配列には、^nameおよびの戻り値が あり++ます。
wamba
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.