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


14

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

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

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

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

回答:


8

コメントに書いたように、.map(*.say)REPLを使用すると、他のユーザーもTrue値を含む行を作成します。.sink最後のmapステートメントの後でメソッドを呼び出そうとすることができます。

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

たぶん...しかし、REPLはTrue入力リストと同じ長さの値のリストを吐き出します。理想的ではありません。
ショーン

".".IO.dir.grep(*.contains("e")).map(*.uc).map: {.say; Empty}同じことを行いますが、REPLで空のリストについてのみ言及します
Elizabeth Mattijsen

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()形式を使用すると、1行に固執する必要がある(または\ 、どこでも手に負えないように使用する)などの欠点があります。
Tyil、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.