Сначала я просто удивился, почему перед пустыми скобками в строке 2 этого кода стоит двоеточие (из Perl 6 Advent Calendar, 25 декабря 2018 г.)?
sub is-happy( $n is copy ) {
my $seen-numbers = :{};
while $n > 1 {
return False if $n ∈ $seen-numbers;
$seen-numbers{$n} = True;
$n = $n.comb.map(*²).sum
}
return True;
}
say is-happy(7); # True
say is-happy(2018); # False
Этот код запускается практически мгновенно. Я пытался say $seen-numbers.^name;
и обнаружил, что это был Hash[Mu,Any]
.
Однако, когда я удаляю двоеточие, is-happy(7)
возвращает True
, но затем is-happy(2018)
связывает процессор в течение нескольких минут (пока я не завершил процесс). Также, в этом случае, say $seen-numbers.^name;
печатает Hash
.
Итак, очевидно :{}
приводит к созданию Hash[Mu,Any]
. Как это работает? Это обходной путь или идиоматизм? А что такое Hash[Mu,Any]
и как он сравнивается с обычным Hash
?