我想做一个集合的哈希。好吧,SetHashes,因为它们需要是可变的。
事实上,我想用同一个 SetHash 的多个相同副本来初始化我的 Hash。
我有一个包含新哈希键的数组:@keys
而且我的 SetHash 已经在一个标量变量中初始化:$set
我正在寻找一种干净的方法来初始化哈希。
这有效:
my %hash = ({ $_ => $set.clone } for @keys);
(括号是优先级所必需的;没有它们,分配到%hash
是for
循环体的一部分。我可以将其更改为非后缀 for 循环或进行其他几个小的更改以获得相同的结果不同的方式,但这不是我在这里感兴趣的。)
相反,我有点希望我可以使用 Raku 的一个漂亮的超级操作员,可能是这样的:
my %hash = @keys »=>» $set;
当$set
是一个简单的字符串或数字,但一个 SetHash?
Array >>=>>> SetHash can never work reliably: order of keys in SetHash is indeterminate
很高兴知道,但我不希望它以任何顺序超过 RHS。这就是为什么我使用了超操作的右指向版本:所以它会根据需要复制 RHS 以将其与 LHS 匹配。在这种表达方式中,有没有办法说“哟,Raku,把它当作一个标量。不,真的。”?
我尝试了一个显式的 Scalar 包装器(这会使值更难获得,但这是一个实验):
my %map = @keys »=>» $($set,)
这给了我这样的信息:
Lists on either side of non-dwimmy hyperop of infix:«=>» are not of the same length while recursing
left: 1 elements, right: 4 elements
因此,它显然已经递归到左侧的列表中并找到了一个键,并试图将其映射到右侧具有 4 个元素的集合。这就是我想要的 - 映射到集合的键。但相反,它将它映射到集合的元素,并且超级操作员为这种大小组合指出了错误的方式。
那么为什么它会在右边递归呢?我认为标量容器会阻止这种情况。文档说它可以防止扁平化;这个递归怎么没有变平?有什么区别?
错误消息说我正在使用的超级操作器的版本是“非 dwimmy”,这可以解释为什么它实际上并没有按照我的意思做,但是可能有一个甚至更少的 dwimmy 版本让我变得更加明确的?我的大脑仍然没有很好地与 Raku 的工作方式保持一致,以便能够可靠地告诉 WIM。