Inicialização variável de distorção do tempo?


8

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?

Respostas:


7

consulte Any.pm6 # L519 , o candidato

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

é usado. Existem outros candidatos para valores indefinidos, você pode tentar

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

my Num $y;
dd $y++; #0e0

1
Então, se eu entendi corretamente, o "envio" para a matriz @a é feito APÓS a ação implícita na função postfix ++?
jakar 24/01

1
Sim, claro. O mesmo que para ^name. Na matriz, são retornados valores de ^namee ++.
wamba 24/01
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.