Чому в послідовностях Perl6 немає "кожного" методу?


14

Іноді я почну писати ланцюжок викликів методів на REPL 6 Perl, наприклад:

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

... і тоді я розумію, що те, що я хочу зробити з остаточним списком, - це надрукувати кожен елемент у своєму рядку. Я б очікував, що послідовності матимуть щось на зразок eachметоду, щоб я міг закінчити ланцюг .each(*.say), але такого способу, який я можу знайти, я не можу знайти. Натомість я мушу повернутися до початку рядка та передбачити .say for. Таке відчуття, ніби воно порушує потік моїх думок.

Це незначна роздратованість, але це вражає мене таким неяскравим упущенням, що мені цікаво, чи не пропускаю я якусь легку альтернативу. Тільки ті , які я можу думати є ».sayі .join("\n").say, але перші можуть працювати на елементах з замовлення (якщо я правильно розумію) і останні конструкції один рядок , яка може бути проблемно великим, в залежності від вхідного списку.

Відповіді:


8

Як ви писали в коментарі, просто інший .map(*.say)також створює рядок зі значеннями True при використанні REPL. Ви можете спробувати зателефонувати .sinkпісля останнього твердження на карті.

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

Я припускаю ... але тоді REPL виплюне список Trueзначень тієї ж довжини, що і список введення. Не ідеально.
Шон

".".IO.dir.grep(*.contains("e")).map(*.uc).map: {.say; Empty}зробимо те саме, але лише згадайте порожній список у відповіді
Елізабет Маттійсен

Я вважаю, що REPL має на увазі не виводити результат рядка, якщо він був отриманий; це робиться так, зателефонувавши tellдо файлового файлу до та після команди та порівнюючи їх, я думаю? тому щось може піти не так з цією логікою.
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(), якщо вони не хочуть зіграти з розширенням.
користувач0721090601

Використання .&each()формату має недоліки, такі як необхідність дотримуватися єдиного рядка (або використовувати досить громіздке в \ усьому місці).
Тийл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.