Perl 6中能否通过哈希传递命名参数?如何正确实现?
在Perl 6中使用哈希传递命名参数的正确方法
当然可以用哈希传递命名参数!你遇到的报错其实是个常见小坑——直接把哈希传给只接受命名参数的子例程时,Perl 6会把整个哈希当作一个位置参数处理,而你的adding子例程明确要求0个位置参数、只接受命名参数,所以才会抛出「Too many positionals passed」的错误。
解决这个问题的关键是用Perl 6的双星号展开操作符(**),它的作用就是告诉编译器:把哈希里的键值对拆解成对应的命名参数传递给子例程。
正确实现的完整示例
sub adding(:$first, :$second) { $first + $second } # 直接传递命名参数,正常运行 say adding(second => 2, first => 1); # 输出: 3 # 用哈希存储命名参数 my %param = second => 2, first => 1; say %param; # 输出: {first => 1, second => 2} # 使用**展开哈希,作为命名参数传递 say adding(**%param); # 输出: 3
额外小技巧:处理多余的哈希键
如果你的哈希里包含子例程不需要的键,直接用**%param会报错。这时候可以在子例程定义里加上*%来接受并忽略所有额外的命名参数:
# 新增*%来接收多余的命名参数 sub adding(:$first, :$second, *%) { $first + $second } my %param = second => 2, first => 1, third => 3; say adding(**%param); # 依然输出3,自动忽略third参数
内容的提问来源于stack exchange,提问作者Eugene Barsky
相关产品推荐
相关产品推荐

