【问题标题】:Perl6 optional function flagsPerl6 可选函数标志
【发布时间】:2016-08-04 09:12:00
【问题描述】:

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

format 'a b c';

或者像这样:

format :pretty 'a b c';

我该怎么做?谢谢

【问题讨论】:

    标签: raku


    【解决方案1】:

    这只是一个命名参数,在标志的情况下是一个布尔值。这一切都解决了,因为 :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';
    

    【讨论】:

      【解决方案2】:

      如果你真的想要那种奇怪的语法,你可以使用一个操作符和一些子签名魔法。 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")␤»
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-04
        • 2019-07-09
        • 1970-01-01
        • 2016-09-27
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 2011-04-05
        相关资源
        最近更新 更多