Когда for
вызывает метод итератора?
Как я понимаю, если ( single ) аргумент функции итерации является Scalar
контейнера, то он использует значение в контейнере и не вызывает .iterator
.В противном случае он вызывает .iterator
для него, сначала оценивая его, если это выражение или обычный вызов.
&logger does Forable;
.say for &logger;
Это просто не работает;say
применяется к &logger
как простой элемент.
* &
- это маркер существительного (сигил), обозначающий Callable
, который по своей сути является одной вещью, единым блокомcode.
В частности, &logger
привязан к контейнеру Scalar
, тип которого Callable
, точно такой же, как $logger
(с символом $
), если бы вы написали my Callable $logger
:
say .WHAT, .VAR, .VAR.WHAT, .VAR.of
for my &logger, my Callable $logger
отображает:
(Callable)Callable(Scalar)(Callable)
(Callable)Callable(Scalar)(Callable)
Поскольку тип для &logger
равен Block+{Forable}
Это на самом деле типCallable
, который содержится в Scalar
контейнере, который связан с &logger
.
Это не тип самого контейнера &logger
,это Scalar
, как показано выше.
При задании одного аргумента в форме переменной итерационные функции, такие как for
, смотрят на переменную, а не на значение, содержащееся в переменной, чтобы увидетьесли это Iterable
.A Scalar
- это не Iterable
.
Есть идеи, как это решить?
См. Ответ lizmat для одного подхода.