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

cod*_*ons 8 default-value rakudo raku

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

考虑以下代码:

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

有没有一种好方法可以更改&for的签名/正文,&g以便打印foo而不是Any

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

选项1:

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

选项 2:

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

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

Eli*_*sen 7

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

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

  • 我的猜测一直是...参数列表中的“|c”将符号“c”绑定到从传入捕获的剩余部分构建的新捕获,该捕获在“|”之前尚未被签名处理删除。 c`。如果“|c”位于签名的开头,则编译器只会绑定到原始捕获。类似地,参数列表中的“|c”执行逻辑相反的操作,理论上将“c”捕获滑入为调用构造的新捕获中,但是,同样,如果参数列表中没有其他内容,则可能只是直接按原样使用该捕获。参数列表。 (2认同)