我可以在没有参数的 Perl 6 multis 之间进行选择吗?
Posted
技术标签:
【中文标题】我可以在没有参数的 Perl 6 multis 之间进行选择吗?【英文标题】:Can I choose between Perl 6 multis that have no parameters? 【发布时间】:2018-06-11 16:11:09 【问题描述】:我可以根据一些非参数值选择一个 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
我似乎记得有人用来在完全不带参数的 multis 之间调度的一些技巧。例如,我有一个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;
【问题讨论】:
【参考方案1】:您可以使用()
解构|
。
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 () …
【讨论】:
【参考方案2】:坚持捕获为空的更优雅的方法是使用空子签名来指定它:
multi show-env ( | () where ? $*DEBUG ) dd %*ENV
multi show-env ( | () where ! $*DEBUG ) True
【讨论】:
以上是关于我可以在没有参数的 Perl 6 multis 之间进行选择吗?的主要内容,如果未能解决你的问题,请参考以下文章
perl学习记录2-时间日期获取之localtime和time