No loop for simples a seguir, criamos uma matriz (@a) incrementando uma variável sem tipo ($ n):
my @a = do for 1..3 {
state $n;
$n.^name, $n++;
}
say @a;
O resultado é "tipo de" esperado:
[(Any 0) (Int 1) (Int 2)]
E digo "mais ou menos" porque esperava como o primeiro valor de $ n o valor "indefinido" (Qualquer).
É como, depois que o primeiro valor é produzido (Qualquer) e à medida que incrementamos o $ n (após o primeiro incremento de $ n temos uma conversão para um Int), também há algum evento de distorção de tempo na atribuição e obtemos também o primeiro valor a mudar. Então, acabamos tendo o primeiro valor como 0 (zero).
Alguém pode explicar o mecanismo exato desse comportamento?