为何Raku中Array:D无法匹配Array @r签名?求解答
问题原因
你写的multi sub report(Array @r)里的@r是数组形参(位置绑定的数组),它的作用是捕获多个位置参数到数组中,或者接收一个数组变量(比如@my-arr),但并不匹配直接传入的Array类型对象实例。而%$result{'targets'}{'integer'}返回的是一个独立的Array对象,不是数组变量,所以无法匹配这个签名。
解决方法
有三种常见的解决方式,根据需求选择:
方式一:修改子签名为接受Array类型标量
把Array @r改成Array $r,直接匹配单个Array实例:
multi sub report(Array $r) { say $r.raku } multi sub report(Match $r) { say $r.raku }
修改后调用report(%$result{'targets'}{'integer'})就能正常执行,因为签名明确接受单个Array类型的标量参数。
方式二:调用时将Array实例转为数组变量
先把返回的Array对象赋值给数组变量,再传入:
sub MAIN() { my $result = Integers.parse(' a 1234 '); report($result); report(%$result{'targets'}); my @ints = %$result{'targets'}{'integer'}; report(@ints); }
数组变量@ints会和Array @r的签名匹配。
方式三:调用时展开数组(适合多参数场景)
如果report(Array @r)是用来处理多个位置参数,用|展开Array实例,把数组元素作为多个参数传入:
report(|%$result{'targets'}{'integer'})
但这种方式下@r会捕获所有展开后的元素,若只是想处理整个Array对象,方式一更合适。
修改后验证输出
用方式一修改后,程序输出会变为:
Match.new(:orig(" a 1234 "), :from(0), :pos(8), :hash(Map.new((:targets(Match.new(:orig(" a 1234 "), :from(3), :pos(8), :hash(Map.new((:integer([Match.new(:orig(" a 1234 "), :from(3), :pos(7))])))))))))) Match.new(:orig(" a 1234 "), :from(3), :pos(8), :hash(Map.new((:integer([Match.new(:orig(" a 1234 "), :from(3), :pos(7))]))))) [Match.new(:orig(" a 1234 "), :from(3), :pos(7))]
完全符合预期,无报错。
内容的提问来源于stack exchange,提问作者FyFAIR
相关产品推荐
相关产品推荐

