Инициализация переменной деформации времени? - PullRequest
8 голосов
/ 24 января 2020

В следующем простом для l oop мы создаем массив (@a), увеличивая переменную без типа ($ n):

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

say @a;

Результат «ожидаемый»:

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

И я говорю «вид», потому что я ожидал в качестве первого значения $ n значения «неопределенное» (любое).

Это похоже на то, что после первого значения произвел (Any), и когда мы увеличиваем $ n (после первого приращения $ n у нас происходит приведение к Int), в присваивании также происходит некоторое искажение времени, и мы также получаем первое значение, которое нужно изменить. Таким образом, мы получаем первое значение 0 (ноль).

Может кто-нибудь объяснить точный механизм этого поведения?

1 Ответ

7 голосов
/ 24 января 2020

см. Any.pm6 # L519 , используется кандидат

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

. Есть еще несколько кандидатов на неопределенные значения, вы можете попробовать

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

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