В следующем простом для 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 (ноль).
Может кто-нибудь объяснить точный механизм этого поведения?