Почему нет «каждого» метода в последовательностях Perl6? - PullRequest
14 голосов
/ 02 октября 2019

Иногда я начинаю писать цепочку вызовов методов в Perl 6 REPL, например:

".".IO.dir.grep(...).map(...).

... и затем я понимаю, что то, что я хочу сделать с окончательным списком, это printкаждый элемент на своей линии. Я ожидал бы, что у последовательностей будет что-то вроде each метода, чтобы я мог закончить цепочку с .each(*.say), но нет такого метода, который я мог бы найти. Вместо этого я должен вернуться к началу строки и добавить .say for. Такое ощущение, что это нарушает поток моих мыслей.

Это незначительное раздражение, но оно кажется мне таким вопиющим упущением, что я задаюсь вопросом, упускаю ли я какую-то легкую альтернативу. Единственные, о которых я могу думать, это ».say и .join("\n").say, но первый может работать с элементами не по порядку (если я правильно понимаю), а второй создает одну строку, которая может быть проблематично большой, в зависимости от входных данных. список.

Ответы [ 2 ]

11 голосов
/ 02 октября 2019

Вы можете бросить свой собственный.

use MONKEY;

augment class Any 
{ 
    method each( &block )
    {
        for self -> $value { 
            &block( $value );
        }
    }
};

List.^compose;
Seq.^compose;

(1, 2).each({ .say });
(2, 3).map(* + 1).each({ .say });

# 1
# 2
# 3
# 4

Если вам нравится это, у вас есть возможность Первый CPAN-модуль прямо здесь.

8 голосов
/ 02 октября 2019

Как вы написали в комментарии, просто другой .map(*.say) также создает строку со значениями True при использовании REPL. Вы можете попытаться вызвать метод .sink после последнего оператора map.

".".IO.dir.grep({$_.contains('e')}).map(*.uc).map(*.say).sink
...