2012-08-31 3 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을 수행하지만 (다시 키/값의 압축을 풀어야 함) 여기서는 키가 아니라 쌍만 가져옵니다 (메서드가 구현되는 방식 때문에 소스 코드를 확인하십시오 자세한 내용은 당신이 Hash#select의 문서에 가면

>> {a: 1, b: 2}.map { |x| p x } 
[:a, 1] 
[:b, 2] 
>> {a: 1, b: 2}.select { |x| p x } 
:a 
:b 

, 당신은 명시 적으로 압축을 푼 인수가 필요 볼 수 있습니다. 결론 : 어떤 메소드로 해시를 반복 할 때 항상 키/값의 압축을 풉니 다.

records.group_by(&:opportunity).select { |key, values| values.length > 1 }