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


14

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

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

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

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

Answers:


8

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

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

我想...但是,REPL会吐出True与输入列表长度相同的值列表。不理想。
肖恩

".".IO.dir.grep(*.contains("e")).map(*.uc).map: {.say; Empty}会做同样的事情,但只在REPL中提及一个空名单
伊丽莎白·马蒂森

我相信REPL的意思是如果已经输出,则不输出行的结果;tell我认为这是通过在命令之前和之后调用out文件句柄并进行比较来实现的?因此该逻辑可能出了点问题。
timotimo

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

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


1
CPAN模块的好答案和好主意。您可能会考虑提及它,可以将其制作为常规子对象,并使用来调用.&each(),以防他们不想因扩充而烦恼。
user0721090601

使用.&each()格式会带来不利影响,例如必须坚持一行(或者\ 到处使用笨拙)。
蒂尔,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.