2012-08-31 39 views
0

group_by創建哈希試圖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]命令。這是什麼造成的?

回答

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 }