2016-08-04 6 views
5

Wie kann ich Funktionen implementieren, die ein optionales Flag in Perl6 verwenden? Zum Beispiel, sagen, dass ich so meine Funktion aufrufen wollen:Perl6 optionale Funktionsflags

format 'a b c'; 

oder so:

format :pretty 'a b c'; 

Wie kann ich das tun? Danke

Antwort

10

Es ist nur ein benanntes Argument, im Falle von Flags ein Boolean. Dies alles funktioniert, weil :pretty ist syntaktischer Zucker für das Paar :pretty(True) aka pretty => True.

Sie entweder den Booleschen Wert

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

oder benutzen Sie seine Anwesenheit für Multi-Versand

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

Im ersten Beispiel verwenden können, wenn wir einen Standardwert (die nicht wirklich notwendig ist, da der undefinierte Wert auf False boolisiert, aber es ist wohl das "Richtige" semantisch zu tun, im zweiten haben wir es zu einem erforderlichen Parameter gemacht, indem wir ! hinzugefügt haben.

Beachten Sie auch, dass benannte Argumente noch durch Kommas getrennt werden müssen, dh Sie können es als

format :pretty, 'a b c'; 
3

verwenden würden, wenn Sie wirklich wollen, dass ungerade Syntax, Sie einen Operator und einige Untersignatur Magie verwenden können. Die Methode Bool ist optional und die Klasse Pretty kann leer sein. Es ist nur da, um etwas für den MMD-Dispatcher zur Verfügung zu stellen.

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