从使用select
创建的哈希尝试group_by
时,我遇到了奇怪的行为:
当我跑步时
all_records.group_by(&:opportunity).map{|foo| foo[1].length != 1 }.select{|x| x}
我得到了一些元素:=> [true, true]
然而,当我尝试选择时,使用确切的块map
ped:
all_records.group_by(&:opportunity).select{|foo| foo[1].length != 1 }
我没有结果:=> {}
就像完整性检查一样,当我第一次将哈希值转换为sort
的数组时,它会按预期工作:
all_records.group_by(&:opportunity).sort.select{|foo| foo[1].length != 1 }.length
结果:=> 2
这对我来说很奇怪,因为第一个结果表明哈希完全识别了foo[1]
命令。造成这种情况的原因是什么?
答案 0 :(得分:2)
在第一个片段中,你在哈希上做了一个Enumerable#map
,一个块获得了一个参数(为什么不解压缩它?),这里你得到一对(如你所料) 。在第二个片段中,您再次使用单个参数执行Hash#select
(并且您应该再次解压键/值),但是这里只获得键,而不是对(因为方法的实现方式,检查源代码以获取详细信息。)
>> {a: 1, b: 2}.map { |x| p x }
[:a, 1]
[:b, 2]
>> {a: 1, b: 2}.select { |x| p x }
:a
:b
如果你转到Hash#select的文档,你会发现它显然需要解压缩的参数。结论:在使用任何方法迭代哈希值时,始终解压缩键/值:
records.group_by(&:opportunity).select { |key, values| values.length > 1 }