保留嵌套命名参数的默认值
Keeping default values for nested named parameters
我怀疑这个问题很容易回答,而且答案是否定的。但是,我想确保我没有遗漏任何东西。
考虑以下代码:
sub f(:$a = 'foo') { say $a }
sub g(:$a) { f :$a }
g(); # OUTPUT: «(Any)»
有什么好的方法可以更改 &f
或 &g
的 signature/body 以便打印 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,或者如果子“g”总是只调用子“f”,来创建 所有 参数的捕获,然后将其传递:
sub f(str :$a = 'foo') { say $a }
sub g(|c) { f |c }
g a => "bar"; # "bar"
g; # "foo"
我怀疑这个问题很容易回答,而且答案是否定的。但是,我想确保我没有遗漏任何东西。
考虑以下代码:
sub f(:$a = 'foo') { say $a }
sub g(:$a) { f :$a }
g(); # OUTPUT: «(Any)»
有什么好的方法可以更改 &f
或 &g
的 signature/body 以便打印 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,或者如果子“g”总是只调用子“f”,来创建 所有 参数的捕获,然后将其传递:
sub f(str :$a = 'foo') { say $a }
sub g(|c) { f |c }
g a => "bar"; # "bar"
g; # "foo"