Perl6 dizilerinde neden “her” yöntemi yok?


14

Bazen Perl 6 REPL'de bir yöntem çağrısı zinciri yazmaya başlayacağım, örneğin:

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

... ve son listeyle ne yapmak istediğimin her öğeyi kendi satırına yazdırmak olduğunu anlıyorum. Dizilerin bir eachyöntem gibi bir şey olmasını beklerdim, böylece zinciri bitirebilirim .each(*.say), ancak bulabileceğim bir yöntem yok. Bunun yerine satırın başına dönüp başımın başına gelmeliyim .say for. Düşüncelerimin akışını kesiyormuş gibi geliyor.

Bu küçük bir sıkıntı, ama bu kadar göze çarpan bir ihmal olarak bana çok kolay bir alternatif eksik olup olmadığımı merak ediyor. Aklıma gelen tek olanlar ».sayve .join("\n").sayancak (eğer doğru anlamak) eski bozuk elemanlarında çalışabilir ve ikincisi yapıları tek bir dize girdi listeye bağlı olarak, sorunsal olarak büyük olabilir ki.

Yanıtlar:


8

.map(*.say)Yorumda yazdığınız gibi, REPL kullanırken sadece bir diğeri True değerleri olan bir çizgi oluşturur. .sinkSon harita ifadesinden sonra yöntemi çağırmayı deneyebilirsiniz .

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

Sanýrým ... ama sonra REPL Truegiriţ listesiyle ayný uzunlukta deðerler listesi verir. Uygun değil.
Sean

".".IO.dir.grep(*.contains("e")).map(*.uc).map: {.say; Empty}aynısını yapacak, ancak sadece
REPL'de

Ben REPL çıktı olsaydı bir hattın sonucunu çıktı amaçlı değil inanıyorum; tellkomuttan önce ve sonra dışarı dosya tanıtıcısını çağırarak yapar ve bunları karşılaştırır, sanırım? bu mantıkla ilgili bir şeyler ters gidebilir.
timotimo

11

Kendinizi yuvarlayabilirsiniz.

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

Eğer bunu beğendiyseniz, orada ilk CPAN modülü fırsatınız var.


1
Bir CPAN modülü için harika bir cevap ve fikir. Artırmakla uğraşmak istemiyorlarsa, normal bir alt yapıya dönüştürülebileceğini ve çağrıldığını söyleyebilirsiniz .&each().
user0721090601

.&each()Biçimi kullanmak, tek bir satıra yapışmak (veya \ her yerde oldukça kullanışsız olmak) gibi olumsuz taraflarla birlikte gelir .
Tyil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.