2016-08-04 83 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")␤»