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?
quelle
^name
. Im Array werden Werte von^name
und zurückgegeben++
.