Ответ 1
@$foo
не подходит для @($foo)
, где $foo
- это переменная item, а синтаксис @(...)
просто вызывает .list
по его аргументу. Как метод, так и синтаксическую форму иногда называют "контекстуализатором списка/массива", хотя я не могу найти, где синтаксическая форма документирована в официальных документах Perl 6.
Одно использование для него - это когда вы хотите перебирать массив, хранящийся в контейнере элементов. Контейнер элементов считается единственным элементом встроенных элементов, таких как циклы for
, тогда как вызов .list
на нем возвращает простой массив без окружающего контейнера элемента (то есть "заставляет значение интерпретироваться в контексте списка" ):
my $foo = [1, 2, 3];
say $foo.perl; # $[1, 2, 3]
say $foo.list.perl; # [1, 2, 3]
say @$foo.perl; # [1, 2, 3]
for $foo { ... } # One iteration
for $foo.list { ... } # Three iterations
for @$foo { ... } # Three iterations (identical to the previous line)
:!foo
не подходит для :foo(False)
, то есть named argument, который имеет значение False
sub do-something (:$verbose = True) { say $verbose; }
do-something; # True
do-something :verbose; # True
do-something :!verbose; # False
При написании в позиции позиции, но не как аргументе списка аргументов, он создает объект Pair:
say (:!verbose); # verbose => False