我可以在没有参数的 Perl 6 multis 之间进行选择吗?

Can I choose between Perl 6 multis that have no parameters?

我可以根据一些非参数值选择一个 multi,但我必须至少有一个参数,这样我才能在其中拼凑 where:

our $*DEBUG = 1;
debug( 'This should print', 'Phrase 2' );

$*DEBUG = 0;
debug( 'This should not print' );

multi debug ( *@a where ? $*DEBUG ) { put @a }
multi debug ( *@a where ! $*DEBUG ) { True }

我似乎记得有人用来在完全不带参数的多重调度中使用的一些技巧。例如,我有一个 show-env 例程,我想随意使用它,它只会在我设置了一些调试条件后才执行任何操作。我可以像我展示的那样实现它,但这不是很令人满意,而且这不是我想象的我在其他地方看到的聪明的东西:

our $*DEBUG = 1;
debug( 'This should print', 'Phrase 2' );
show-env();

$*DEBUG = 0;
debug( 'This should not print' );
show-env();

multi debug ( *@a where ? $*DEBUG ) { put @a }
multi debug ( *@a where ! $*DEBUG ) { True }

# use an unnamed capture | but insist it has 0 arguments
multi show-env ( | where { $_.elems == 0 and ? $*DEBUG } ) { dd %*ENV }
multi show-env ( | where { $_.elems == 0 and ! $*DEBUG } ) { True }

我可以用可选的命名参数做类似的事情,但这更不令人满意。

当然,我可以在这个简单的例子中做到这一点,但这并不好玩:

sub show-env () {
    return True unless $*DEBUG;
    dd %*ENV;
    }

您可以用 () 解构 |

my $*DEBUG = 1;
show-env();

$*DEBUG = 0;
show-env();

# use an unnamed capture | but insist it has 0 arguments by destructuring
multi show-env ( | ()   where ? $*DEBUG ) { dd %*ENV }
multi show-env ( | ()   where ! $*DEBUG ) { True }

show-env(42); # Cannot resolve caller show-env(42); …

或者您可以有一个 proto 声明

proto show-env (){*}
multi show-env ( |      where ? $*DEBUG ) { dd %*ENV }
multi show-env ( |      where ! $*DEBUG ) { True }

show-env(42); # Calling show-env(Int) will never work with proto signature () …

坚持捕获为空的更优雅的方法是用空子签名指定它:

multi show-env ( | () where ? $*DEBUG ) { dd %*ENV }
multi show-env ( | () where ! $*DEBUG ) { True }