保留嵌套命名参数的默认值

问题描述

我怀疑这个问题很容易回答,答案是否定的。但是,我想确保我没有遗漏任何东西。

考虑以下代码:

sub f(:$a = 'foo') { say $a }
sub g(:$a) { f :$a }
g();  # OUTPUT: «(Any)»

有什么好的方法可以更改 &f&g 的签名/正文,以便打印 foo 而不是 Any

我知道有两种方法可以让 &f 使用 $a 的默认值,但它们都不是很好。

选项 1:

sub f(:$a = 'foo') { say $a }
multi g(:$a) { f :$a }
multi g()    { f }
g();  # OUTPUT: «foo»

选项 2:

sub f(:$a = 'foo') { say $a }
sub g(:$a) { f |(:$a with $a) }
g();  # OUTPUT: «foo»

这些方法都不是很棒的方法,所以我希望有人可以向我展示一种我缺少的更优雅的方法。另一方面,这两个都有效,所以如果这只是一个稍微不优雅的角落(而且是一个非常小的角落)肯定不会有什么大不了的。

解决方法

我会使用选项 1,或者如果 sub "g" 总是只调用 sub "f",来创建 所有 参数的捕获,然后将其传递:

sub f(str :$a = 'foo') { say $a }
sub g(|c) { f |c }
g a => "bar";  # "bar"
g;             # "foo"

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...