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

