Mengapa tidak ada "masing-masing" metode pada urutan Perl6?


14

Terkadang saya akan mulai menulis serangkaian panggilan metode di Perl 6 REPL, seperti:

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

... dan kemudian saya menyadari bahwa apa yang ingin saya lakukan dengan daftar terakhir adalah mencetak setiap elemen pada barisnya sendiri. Saya berharap urutan memiliki sesuatu seperti eachmetode sehingga saya bisa mengakhiri rantai dengan .each(*.say), tetapi tidak ada metode seperti itu yang bisa saya temukan. Sebaliknya saya harus kembali ke awal baris dan menambahkan .say for. Rasanya seperti menghancurkan aliran pikiranku.

Ini gangguan kecil, tapi menurut saya kelalaian yang mencolok sehingga saya bertanya-tanya apakah saya kehilangan beberapa alternatif mudah. Satu-satunya yang dapat saya pikirkan adalah ».saydan .join("\n").say, tetapi yang pertama dapat beroperasi pada elemen-elemen yang tidak berurutan (jika saya mengerti dengan benar) dan yang terakhir membangun sebuah string tunggal yang bisa menjadi masalah besar, tergantung pada daftar input.

Jawaban:


8

Seperti yang Anda tulis dalam komentar, hanya yang lain yang .map(*.say)juga membuat garis dengan nilai True saat menggunakan REPL. Anda dapat mencoba memanggil .sinkmetode setelah pernyataan peta terakhir.

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

Saya kira ... tapi kemudian REPL akan mengeluarkan daftar Truenilai dengan panjang yang sama dengan daftar input. Tidak ideal
Sean

".".IO.dir.grep(*.contains("e")).map(*.uc).map: {.say; Empty}akan melakukan hal yang sama, tetapi hanya menyebutkan daftar kosong di REPL
Elizabeth Mattijsen

Saya percaya REPL dimaksudkan untuk tidak menampilkan hasil garis jika telah ada keluaran; apakah itu dengan memanggil tellfilehandle sebelum dan sesudah perintah dan membandingkannya, saya pikir? jadi ada yang salah dengan logika itu.
timotimo

11

Anda bisa menggulung sendiri.

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

Jika Anda suka ini, ada peluang modul CPAN Pertama Anda di sana.


1
Jawaban dan ide bagus untuk modul CPAN. Anda dapat mempertimbangkan menyebutkannya dapat dibuat menjadi sub reguler dan dipanggil dengan .&each(), jika mereka tidak ingin berkutat dengan menambah.
user0721090601

Menggunakan .&each()format datang dengan kelemahan, seperti diminta untuk tetap pada satu baris (atau menggunakan agak sulit di \ semua tempat).
Tyil
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.