0

select尝试使用以下方法创建的哈希时,我遇到了奇怪的行为group_by

当我跑

all_records.group_by(&:opportunity).map{|foo| foo[1].length != 1 }.select{|x| x}

我得到了一些元素:=> [true, true]

然而,当我尝试选择时,使用我mapped 的确切块:

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]完美地识别了该命令。这是什么原因造成的?

4

1 回答 1

2

在第一个片段中,您正在Enumerable#map对哈希执行 a ,其中一个块获得一个参数(为什么不解压缩它?),在这里您得到一对(如您所料)。在第二个片段中,您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 }
于 2012-08-31T16:19:22.157 回答