【发布时间】:2020-12-16 18:29:21
【问题描述】:
我想做一个集合的散列。好吧,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。这就是我使用 hyperop 的右指向版本的原因:因此它会根据需要复制 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”,这可以解释为什么它实际上并没有按照我的意思做,但是否有可能让我使用的超级操作符版本更少更明确?我的大脑还没有完全适应 Raku 的工作方式,无法可靠地告诉 WIM。
【问题讨论】: