Initialisierung von Time Warping-Variablen?

8

In der folgenden einfachen for-Schleife erstellen wir ein Array (@a), indem wir eine typenlose Variable ($ n) inkrementieren:

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

say @a;

Das Ergebnis wird "irgendwie" erwartet:

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

Und ich sage "irgendwie", weil ich als ersten Wert von $ n den "undefinierten" Wert (Beliebig) erwartet habe.

Es ist so, als ob, nachdem der erste Wert erzeugt wurde (Beliebig) und wenn wir das $ n inkrementieren (nach dem ersten Inkrement von $ n haben wir ein Casting zu einem Int), es auch ein Zeitverzerrungsereignis in der Zuweisung gibt und wir auch bekommen der erste Wert, der geändert werden muss. Am Ende haben wir also den ersten Wert als 0 (Null).

Kann jemand den genauen Mechanismus dieses Verhaltens erklären?

Jakar
quelle

Antworten:

7

siehe Any.pm6 # L519 , der Kandidat

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

wird genutzt. Es gibt einige andere Kandidaten für undefinierte Werte, die Sie ausprobieren können

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

my Num $y;
dd $y++; #0e0
Wamba
quelle
1
Wenn ich das richtig verstehe, erfolgt das "Pushing" zum Array @a NACH der Aktion, die von der Postfix ++ - Funktion impliziert wird?
Jakar
1
Ja natürlich. Gleich wie für ^name. Im Array werden Werte von ^nameund zurückgegeben ++.
Wamba