【发布时间】:2016-08-04 09:12:00
【问题描述】:
如何在 Perl6 中实现带有可选标志的函数?例如,假设我想像这样调用我的函数:
format 'a b c';
或者像这样:
format :pretty 'a b c';
我该怎么做?谢谢
【问题讨论】:
标签: raku
如何在 Perl6 中实现带有可选标志的函数?例如,假设我想像这样调用我的函数:
format 'a b c';
或者像这样:
format :pretty 'a b c';
我该怎么做?谢谢
【问题讨论】:
标签: raku
这只是一个命名参数,在标志的情况下是一个布尔值。这一切都解决了,因为 :pretty 是 :pretty(True) aka 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';
【讨论】:
如果你真的想要那种奇怪的语法,你可以使用一个操作符和一些子签名魔法。 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")»
【讨论】: