如果通过地图分配,为什么我需要触摸 Hash?

Why do I need to touch Hash if assigned via map?

当我这样做时它起作用了(这些是方法 TWEAK 结束之前的最后 4 行。但是,我的第一次尝试没有第 3 行并且失败了,因为 %!columns 是空的...

    constant @alphi = 'A'..Inf;

    1 if ! %!columns {
    2     @alphi[0..^@!data.first.elems].map( {%!columns{$_} = $++} );
    3     %!columns  #<== have to "touch" %!columns to avoid empty hash
    4 }  

我很高兴通过“触摸”属性解决了这个问题......但看起来很神奇......谁能解释为什么?

没有第三行的 %!columns,对 map 的调用是惰性的,因此永远不会被评估(%!columns 调用想要检查 current列的值,表示急切)。

要更明确地调用 eagerness,请使用 eager 语句前缀(如下所示)或切换到默认为 eager 的 for 循环。

我认为这段代码会按照您希望的方式运行:

if ! %!columns {
   eager @alphi[0..^@!data.first.elems].map( {%!columns{$_} = $++} );
}