web-dev-qa-db-ja.com

Perl6シーケンスに「各」メソッドがないのはなぜですか?

時々、Perl 6 REPLで次のように一連のメソッド呼び出しを記述し始めます。

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

...そして、最終的なリストでやりたいことは、すべての要素をそれぞれの行に出力することだとわかりました。シーケンスにはeachメソッドのようなものが必要なので、.each(*.say)でチェーンを終了できますが、そのようなメソッドは見つかりません。代わりに、行の先頭に戻って_.say for_を先頭に追加する必要があります。それが私の考えの流れを壊してしまうような気がします。

それはマイナーな煩わしさですが、私がいくつかの簡単な代替案を見逃しているのではないかと思うほどの明白な省略として私を襲います。私が考えることができるのは_».say_と.join("\n").sayだけですが、前者は要素を順不同で操作でき(正しく理解している場合)、後者は問題のある単一の文字列を構築します入力リストに応じて大きくなります。

14
Sean

コメントで書いたように、REPLを使用すると、他の.map(*.say)もTrue値を持つ行を作成します。 .sink最後のmapステートメントの後のメソッド。

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

自分で転がすことができます。

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モジュール機会がそこにあります。

11
Holli