Perl6 可选函数标志

Perl6 optional function flags

如何在 Perl6 中实现带有可选标志的函数?例如,假设我想这样调用我的函数:

format 'a b c';

或者像这样:

format :pretty 'a b c';

我该怎么做?谢谢

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

您可以使用布尔值

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

或使用它的存在进行多分派

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

在第一个例子中,我们提供了一个默认值(这并不是真正必要的,因为未定义的值布尔化为 False,但它可以说是语义上的 'right thing to do'),在第二个例子中我们通过添加 !.

使其成为必需参数

另请注意,命名参数仍需用逗号分隔,即您将其用作

format :pretty, 'a b c';

如果你真的想要那种奇怪的语法,你可以使用运算符和一些子签名魔法。 Bool 方法是可选的,class 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")␤»