奇怪的Ruby group_by和选择行为

时间:2012-08-31 15:59:52

标签: ruby arrays select filter

从使用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]命令。造成这种情况的原因是什么?

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 }