如果通过地图分配,为什么我需要触摸 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{$_} = $++} );
}
当我这样做时它起作用了(这些是方法 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{$_} = $++} );
}