为什么在Perl6序列上没有“每种”方法?

Sea*_*ean 14 perl6 raku

有时我会在Perl 6 REPL上开始编写方法调用链,例如:

".".IO.dir.grep(...).map(...).
Run Code Online (Sandbox Code Playgroud)

...然后我意识到我要对最终列表进行的操作是将每个元素打印在自己的行上。我希望序列具有某种each方法,因此我可以使用结束链.each(*.say),但是没有找到这样的方法。取而代之的是,我必须返回到该行的开头并前置.say for。感觉好像打乱了我的思想。

这是一个小麻烦,但是却让我感到震惊,我不知道我是否缺少一些简单的选择。我唯一想到的是».sayand .join("\n").say,但是前者可以对元素进行无序操作(如果我理解正确的话),而后者可以构造一个字符串,该字符串可能会很大,具体取决于输入列表。

Hol*_*lli 11

您可以自己滚动。

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
Run Code Online (Sandbox Code Playgroud)

如果您喜欢这样,那么这里就是您的第一个CPAN模块的机会。


Val*_*kas 8

正如您在注释中所写,.map(*.say)使用REPL时,只有另一个也创建具有True值的行。您可以尝试.sink在最后一个map语句之后调用method。

".".IO.dir.grep({$_.contains('e')}).map(*.uc).map(*.say).sink
Run Code Online (Sandbox Code Playgroud)