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
相关产品推荐
相关产品推荐

