如何显式使用Perl子程序参数的默认值?
Raku子程序默认值调用的惯用写法
场景与问题
我们定义了如下子程序:
sub test($arg = 'default value') { say $arg }
想要传入一个可能未定义的变量,让子程序使用参数的默认值。尝试了以下写法,但无法达到预期:
my $undefined-value; test $undefined-value // Nil; # 无效,输出"Nil"
自己找到一个可行但略显粗糙的写法:
test |($undefined-value // Empty); # 有效,输出"default value"
符合惯用风格的解决方案
最地道的写法是使用**? 占位符**,代码更简洁直观:
test $undefined-value // ?;
或者保留你找到的思路,写法本身其实也符合惯用风格,只是可以明确它的作用:
test |($undefined-value // Empty);
为什么之前的写法无效?
- 传入
Nil时,子程序会将Nil作为明确的参数值接收,不会触发默认值——默认值仅在未传递对应参数时生效。 Empty是Raku的空序列,通过|展开空序列,相当于没有传递该位置的参数,此时子程序就会启用预设的默认值。?是Empty的语法糖,专门用于这种“跳过参数、使用默认值”的场景,是Raku社区推荐的惯用写法。
内容的提问来源于stack exchange,提问作者fingolfin
相关产品推荐
相关产品推荐

