我怀疑这个问题很容易回答,而且答案是否定的。但是,我想确保我没有遗漏任何东西。
考虑以下代码:
sub f(:$a = 'foo') { say $a }
sub g(:$a) { f :$a }
g(); # OUTPUT: «(Any)»
有没有一个好的方法来更改签名/正文&f
or &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»
这些都不像是great方法,所以我希望有人能向我展示一种我所缺少的更优雅的方法。另一方面,这两者都有效,所以如果这只是一个稍微不优雅的角落(而且是一个非常小的角落),那肯定不会有什么大不了的。
我会使用选项 1,或者如果子“g”总是只调用子“f”,来创建捕获all参数,然后将其传递:
sub f(str :$a = 'foo') { say $a }
sub g(|c) { f |c }
g a => "bar"; # "bar"
g; # "foo"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)