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

Raku中为数组哈希使用is default为何部分场景失效?

Raku哈希中is default(Array.new)为何输出空哈希?

正常运行的示例

my %hash;
for 1..4 -> $i {
    %hash{$i} = Array.new without %hash{$i};
    %hash{$i}.push: $_ for ^$i;
}
say %hash; # OUTPUT: {1 => [0], 2 => [0 1], 3 => [0 1 2], 4 => [0 1 2 3]}

无法正常工作的示例

my %hash is default(Array.new);
for 1..4 -> $i {
    %hash{$i}.push: $_ for ^$i;
}
say %hash; # OUTPUT: {}

符合预期的对比示例

my %hash is default(42);
for 1..4 -> $i {
    %hash{$i}.=Str;
}
say %hash.raku; # OUTPUT: {"1" => "42", "2" => "42", "3" => "42", "4" => "42"}

核心原因:哈希键的添加规则

Raku里is default trait的作用是:当你读取一个不存在的哈希键时,返回指定的默认值,但这个键并不会自动被添加到哈希中——只有当你显式赋值给这个键时,它才会被存入哈希。

  • 第一个示例中,%hash{$i} = Array.new without %hash{$i}是直接给键赋值,所以$i被添加到哈希里,后续的push操作是在哈希已存在的数组上进行,最终能看到结果。
  • 第二个示例里,%hash{$i}.push只是读取默认生成的数组并修改,但没有对%hash{$i}做赋值操作,哈希根本没把$i这个键存进去,所以最后输出空哈希。
  • 第三个示例的%hash{$i}.=Str是语法糖,展开后是%hash{$i} = %hash{$i}.Str——这里存在赋值操作,所以$i被添加到哈希中,最终能看到每个键对应的字符串值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:56:08