2016-08-04 136 views
5

如何实现在Perl6中采用可选标志的函数?例如,说我想引用我的功能是这样的:Perl6可选功能标志

format 'a b c'; 

或像这样:

format :pretty 'a b c'; 

我怎样才能做到这一点?谢谢

回答

10

这只是一个命名参数,如果标志是布尔值。这一切都奏效了,因为:pretty是语法糖对:pretty(True)又名pretty => True

您可以使用布尔值

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

,或者使用它的存在对多派遣

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

在第一个例子中,我们提供的默认值(这是不是真的有必要因为未定义的值大致为False,但它可以说是'正确的做'的语义),在第二个中,我们通过添加!使其成为必需的参数。

还要注意的是命名参数还是必须用逗号隔开,即你使用它作为

format :pretty, 'a b c'; 
3

如果你真的想要那个奇怪的语法,你可以使用运营商和一些子签名魔术。 Bool方法是可选的,类Pretty可以是空的。它只是为了给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")␤»