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

Perl 6中能否将Array作为Hash的键?实操报错求助

在Raku中使用Array作为Hash键的正确方式

你遇到的问题是Raku的Hash下标语法解析规则导致的——%h{[1,2]}会被当作切片操作,系统会把数组[1,2]里的每个元素单独作为键处理,也就是尝试给%h{1}和%h{2}赋值,这自然不符合你声明的Array类型键要求,所以触发了类型检查错误。

要正确把整个Array当作单个键使用,你需要明确告诉编译器你的意图,有两种常用写法:

方法一:用圆括号包裹数组

通过圆括号把数组包裹起来,避免被解析为切片:

my %h{Array};
%h{ ([1,2]) } = [3,4];
say %h{ ([1,2]) }; # 输出 [3 4]

方法二:使用函数式调用语法

Raku的Hash支持函数式调用的方式访问单个键,这种写法更直观:

my %h{Array};
%h([1,2]) = [3,4];
say %h([1,2]); # 输出 [3 4]

关键注意点

需要特别提醒:Raku中Array作为Hash键是**按对象标识(identity)**匹配的,而非内容。也就是说,即使两个数组内容完全一致,只要是不同的对象,就会被视为不同的键:

my %h{Array};
my $a = [1,2];
%h($a) = [3,4];
say %h([1,2]); # 输出 (Any),这是一个新的数组对象
say %h($a);    # 输出 [3 4],和赋值时用的是同一个对象

如果需要按数组内容作为键匹配,你可以考虑用List(不可变序列)替代Array,或者自定义基于内容哈希的类型,不过这就是另一个话题了。

内容的提问来源于stack exchange,提问作者Hunter McMillen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:51:22