Значение удерживается в Scalar контейнере не автоматически итерироваться
В то время как $s
и $seq
являются scalars (так называемый «переменные»), $s
связан непосредственно к значению Seq, тогда как ваши $seq
привязан к посредник Scalar (примечание в верхнем регистре S
) «контейнер», который, в свою очередь, содержит Seq. Значение, хранящееся в контейнере Scalar, равно , а не, автоматически повторяется при использовании с такими функциями, как for
.
Более подробно:
my $s := 0 ... 3;
.say for $s;
Поскольку my
объявления переменного использует прямой обязательный для оператора :=
инициализации $s
является непосредственно связан с одним значения Seq 0 ... 3
.
Это означает, что оператор for
видит одно значение Seq, определяет, что он выполняет роль Iterable, и выравнивает (итерации) его.
Теперь рассмотрит это:
my $s := 0 ... 3;
my $container = $s;
.say for $container;
Поскольку вторая my
декларации использует оператор присваивания =
для инициализации новой переменная $container
сначала привязываются к новому скалярному контейнеру, который затем «содержит» все, что получает назначение.
В соответствии с языком шириной Slurpy Conventions (в частности: «итератор внутри скалярного контейнера не считается»), А for
утверждение не итерации значения удерживается в скалярной контейнере, так что .say for $container
линия только делает один say
,
Аналогичная ситуация применима к вашей исходной процедуре show
, поскольку объявления переменных параметров являются (семантически) контейнерами по умолчанию.
Одним из вариантов являются вместо того, чтобы добавить is raw
черты к вашему параметру $seq
:
sub show ($seq is raw) { .say for $seq }
Это предотвращает обычные автоматическое связывание $seq
к скалярному контейнеру (что в своей очереди будет содержать значение Seq) в качестве части звонок по телефону show
.
Другим вариантом является, чтобы позволить $seq
быть привязан к скалярному контейнеру, но явно сплющить (итерацию) переменную $seq
в теле show
подпрограммы с использованием префикса |
:
sub show ($seq) { .say for |$seq }
Спасибо! Но да, я думаю о бесконечных ленивых последовательностях. :) –