¿Inicialización variable de deformación de tiempo?

8

En el siguiente bucle for simple, creamos una matriz (@a) incrementando una variable sin tipo ($ n):

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

say @a;

El resultado es "tipo de" esperado:

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

Y digo "tipo de" porque he esperado como el primer valor de $ n el valor "indefinido" (Cualquiera).

Es como, después de que se produce el primer valor (Cualquiera) y a medida que incrementamos los $ n (después del primer incremento de $ n tenemos un lanzamiento a un Int) también hay algún evento de deformación de tiempo en la asignación y obtenemos también El primer valor a cambiar. Entonces terminamos teniendo el primer valor como 0 (cero).

¿Alguien puede explicar el mecanismo exacto de este comportamiento?

jakar
fuente

Respuestas:

7

ver Any.pm6 # L519 , el candidato

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

es usado Hay otros candidatos para valores indefinidos, puede intentar

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

my Num $y;
dd $y++; #0e0
wamba
fuente
1
Entonces, si entiendo correctamente, ¿el "empuje" hacia la matriz @a se realiza DESPUÉS de la acción implícita en la función postfix ++?
jakar
1
Sí, por supuesto. Igual que para ^name. En la matriz, hay valores devueltos de ^namey ++.
wamba