Dlaczego nie ma „każdej” metody na sekwencjach Perl6?


14

Czasami zaczynam pisać łańcuch wywołań metod w Perl 6 REPL, na przykład:

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

... a potem zdaję sobie sprawę, że to, co chcę zrobić z ostateczną listą, to wydrukować każdy element na osobnej linii. Spodziewałbym się, że sekwencje będą miały coś w rodzaju eachmetody, dzięki czemu mógłbym zakończyć łańcuch .each(*.say), ale nie ma takiej metody, którą mógłbym znaleźć. Zamiast tego muszę wrócić do początku wiersza i dodać .say for. Wydaje się, że przerywa przepływ moich myśli.

To niewielka irytacja, ale uderza mnie to tak rażące pominięcie, że zastanawiam się, czy brakuje mi łatwej alternatywy. Jedyne, o których mogę myśleć, to ».sayi .join("\n").say, ale te pierwsze mogą działać na elementach nie w porządku (jeśli dobrze rozumiem), a drugie konstruuje pojedynczy ciąg znaków, który może być problematycznie duży, w zależności od listy danych wejściowych.

Odpowiedzi:


8

Jak napisałeś w komentarzu, tylko inny .map(*.say)tworzy linię z wartościami True podczas korzystania z REPL. Możesz spróbować wywołać .sinkmetodę po ostatniej instrukcji mapy.

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

Przypuszczam ... ale wtedy REPL wypluje listę Truewartości o tej samej długości co lista wejściowa. Nieidealny.
Sean

".".IO.dir.grep(*.contains("e")).map(*.uc).map: {.say; Empty}zrobi to samo, ale wspomina tylko o pustej liście w REPL
Elizabeth Mattijsen

Uważam, że REPL ma nie wyprowadzać wyniku linii, jeśli taki wynik był; robi to przez wywołanie tellnaszego uchwytu pliku przed i po poleceniu i porównuje je, tak myślę? więc coś może pójść nie tak z tą logiką.
timotimo

11

Możesz rzucić własny.

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

Jeśli ci się podoba, masz szansę na skorzystanie z pierwszego modułu CPAN .


1
Świetna odpowiedź i pomysł na moduł CPAN. Możesz rozważyć wzmiankę o tym, że można go przekształcić w zwykły subwoofer i wywołać za pomocą .&each(), na wypadek, gdyby nie chcieli zmagać się z rozszerzaniem.
user0721090601

Korzystanie z tego .&each()formatu wiąże się z wadami, takimi jak konieczność trzymania się jednej linii (lub używanie raczej nieporęcznego w \ każdym miejscu).
Tyil
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.