如果通过map分配,为什么还需要触摸Hash?

p6s*_*eve 8 raku

当我这样做时,它起作用了(这些是方法 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 }  
Run Code Online (Sandbox Code Playgroud)

我很高兴这个问题是通过“触摸”属性来解决的......但看起来很神奇......任何人都可以解释为什么吗?

cod*_*ons 7

如果没有%!columns第三行,则调用map是惰性的,因此永远不会被评估(%!columns调用想要检查列的当前值,这意味着急切)。

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

我认为这段代码将按照您想要的方式运行:

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

  • 太棒了 - 谢谢...fwiw我最终​​使用了方法变体以提高可读性 ```@alphi[0..^@!data.first.elems].map( {%!columns{$_} = $++} ).渴望``` (2认同)