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

Raku哈希赋值列表复用问题:为何所有值均为最终计数器值?

Raku哈希赋值列表异常问题解析

问题原因

你这段代码里,%dict{$digit} = ($counter,)的赋值逻辑有个坑:Raku中($counter,)创建的List列表,里面的元素是对$counter变量的引用,不是循环时$counter的当前数值。循环结束后$counter最终变成5,所有哈希值里的列表元素都会指向这个变量,所以输出时全是5。

解决方案

这里提供几种可行的修复方法:

方法1:用临时变量保存当前值

每次循环里把$counter的当前值存到临时变量,再用这个变量创建列表,避免引用共享:

my %dict;
my $counter = 0;
for ^5 -> $digit {
    my $current = $counter;
    %dict{$digit} = ($current,);
    $counter += 1;
}
say %dict; # 输出 {0 => (0), 1 => (1), 2 => (2), 3 => (3), 4 => (4)}

方法2:强制取出当前值

通过克隆或类型转换,让Raku直接取$counter的当前数值,而非变量引用:

my %dict;
my $counter = 0;
for ^5 -> $digit {
    %dict{$digit} = ($counter.clone,); # 克隆当前值生成独立元素
    # 也可以用 %dict{$digit} = ($counter.Int,); 直接取数值
    $counter += 1;
}
say %dict;

方法3:用数组替代列表

数组会存储元素的当前值,不会保留变量引用,适合需要序列结构的场景:

my %dict;
my $counter = 0;
for ^5 -> $digit {
    %dict{$digit} = [$counter];
    $counter += 1;
}
say %dict; # 输出 {0 => [0], 1 => [1], 2 => [2], 3 => [3], 4 => [4]}

如果必须使用List类型,可将数组转为列表:%dict{$digit} = [$counter].List;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:05:17