Raku访问多维Hash值出现Type Array不支持关联索引错误问题
错误本质
你遇到的Type Array does not support associative indexing报错的核心原因非常简单:你尝试用*关联索引(也就是大括号{}访问键的方式)*去操作一个数组类型的值,只有Hash类型才支持用{}按键访问,数组只能用[]按下标访问。
最小示例的问题
你定义的%hash中,key2-dim1对应的值是数组[42, 42],当你执行%hash{'key2-dim1'}{'foo bar'}时,第一层取出的是数组,自然无法用大括号访问键,触发报错。
长示例的问题
长示例的错误源于两个问题:
- 变量名笔误:你开头定义的哈希变量是
%count,后续所有操作都用了不存在的%counts(多了后缀s) - 误用Hash的
push方法:Raku中Hash的push方法逻辑是:如果目标键不存在,就设置为传入的值;如果目标键已存在,会自动把原有值转为数组,再把新值追加到数组中。
你第一次处理Foo Bar时,%counts<Foo>被设置为Hash{ Bar => 1 },访问正常;第二次处理Foo Baz时,你再次给Foo键push新的Hash,原有Hash就被转成了数组[{Bar => 1}, {Baz => 1}],此时你再用%counts<Foo><Baz>访问时,第一层取出的是数组,直接触发报错。
修复方案
你完全不需要手动创建内层Hash、调用push,直接通过二维Hash的赋值语法即可自动创建嵌套结构,修复后代码如下:
my @tracks = 'Foo Bar', 'Foo Baz'; my %counts; # 修正变量名,和后续使用一致 for @tracks -> $title { my @words = split(/\s/, $title); if (@words.elems > 1) { my $i = 0; while (@words.elems - $i > 1) { # 直接给二维Hash赋值,Raku会自动创建内层Hash结构 %counts{@words[$i]}{@words[$i+1]}++; say %counts{@words[$i]}{@words[$i+1]}; say %counts.kv; $i = $i + 1; } } }
运行后输出符合预期:
1 (Foo { Bar => 1 }) 1 (Foo { Bar => 1, Baz => 1 })
内容的提问来源于stack exchange,提问作者Garrett S
相关产品推荐
相关产品推荐

