2016-08-04 19 views
5

Perl6'da isteğe bağlı bir bayrağı alan işlevleri nasıl uygularım? Örneğin, böyle benim işlevi çağırmak istiyorum söylüyorlar: Perl6 isteğe bağlı işlev bayrakları

format 'a b c'; 

veya böyle

:

format :pretty 'a b c'; 

Bunu nasıl yapabilirim? Teşekkürler

cevap

10

Sadece bir argüman, bayrakların boolean olması durumunda. Bu, :pretty:pretty(True) no pretty => True için çift için sözdizimsel şeker olduğundan, tüm bu çalışır.

Sen boolean değerini

sub format($arg, Bool :$pretty = False) { 
    if $pretty { ... } 
    else { ... } 
} 

kullanabilir veya İlk örnekte çoklu sevk

multi format($arg) { ... } 
multi format($arg, Bool :$pretty!) { ... } 

için varlığını kullanabilirsiniz ya, gerçekten gerekli olmadığı (varsayılan bir değer sağladı undefined değeri False'a yükselir, ancak tartışmasız 'semantik olarak yapılması gereken'), ikincisi ise ! ekleyerek gerekli bir parametre yaptık.

Ayrıca adlandırılmış argümanlar hala virgülle ayırarak lazım gerçekten garip sözdizimi, bir operatör ve bazı subsignature büyü kullanabileceği istiyorsanız

format :pretty, 'a b c'; 
3

olarak kullanmak istiyorum yani unutmayın. Bool yöntemi isteğe bağlıdır ve Pretty sınıfı boş olabilir. Sadece orada MMD-dağıtıcı üzerinde tutmak için bir şey sağlamak için var.

class Pretty { method Bool {True} }; 
sub prefix:<:pretty>(|c){ Pretty.new, c }; 
multi sub format((Pretty:D $pretty, |a)){ dd $pretty.Bool, a }; 
multi sub format(|c){ dd c }; 
format :pretty 'a b c'; format 'a b c'; 
# OUTPUT«Bool::True␤\(\("a b c"))␤\("a b c")␤»