You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:50:15