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

