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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:45:03