2016-08-04 20 views
5

Jak mogę zaimplementować funkcje, które pobierają opcjonalną flagę w Perl6? Na przykład, powiedzmy, że chcę, aby wywołać moją funkcję tak:Opcjonalne flagi funkcji Perl6

format 'a b c'; 

lub tak:

format :pretty 'a b c'; 

Jak mogę to zrobić? Dzięki

Odpowiedz

10

Jest to tylko nazwany argument, w przypadku flag jest to boolean. To wszystko działa, ponieważ :pretty jest cukrem syntaktycznym dla pary :pretty(True) aka pretty => True.

Można użyć wartość logiczną

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

lub wykorzystać swoją obecność na wielu wysłania

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

W pierwszym przykładzie, pod warunkiem domyślną wartość (co nie jest naprawdę konieczne ponieważ niezdefiniowana wartość burzy się do False, ale jest to "słuszna rzecz" do zrobienia w znaczeniu semantycznym), w drugim stworzyliśmy wymagany parametr, dodając !.

Należy również pamiętać, że wymienione argumenty nadal muszą być oddzielone przecinkami, tj chcesz użyć go jako

format :pretty, 'a b c'; 
3

Jeśli naprawdę chcesz, że składnia dziwne, można użyć operatora i trochę subsignature magii. Metoda Bool jest opcjonalna, a klasa Pretty może być pusta. Chodzi o to, aby zapewnić coś, co może utrzymać dyspozytor MMD.

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")␤»