2014-08-27 2 views
1

나는 원래의 질문에 대해 언급하려고했지만, 난 그렇게 아직 할 수있는 평판이 없습니다 ....업데이트 해시 값은 설명했습니다

는 너무 쉽게 모든 값을 업데이트하는 방법에 대해 궁금 해서요 해시, 또는 어떤 종류의 동등한 .map이 있다면! 해시 방법. Ruby: What is the easiest method to update Hash values?

내 질문 어떻게 블록이 해시의 각 요소를 반복할지 않습니다됩니다 :이 질문에

hash.update(hash){|key,v1| expresion} 

: 누군가가이 우아한 솔루션을 넣어? 이 같은없는 이유 예를 들어, 나는 일반적으로 각각의 요소에 액세스하기 위해 해시에 .each 전화를해야 할 것 : | 키, 값 {와 블록에서

hash.update(hash.each) do |key ,value| 
    value+=1 
end 

| }} 각 개별 해시 요소에 액세스하고 있지만 시스템에 명시 적으로 말할 필요가 없습니다. 왜 안돼? 고맙습니다.

답변

0

Hash#updateHash#merge!의 별칭입니다.

블록과 메소드를 호출

다음은 (워드 프로세서에서 발췌) 발생 :

블록이 지정되어 [A], [...] 각 복제 키의 값 판정되면 [...] 키와 블록을 호출하여

그래서, 위의 코드는 다음과 같이 작동합니다

해시 자체와 합병하고, 각 블록이 호출 키 중복입니다. 해시를 자체와 병합 할 때 새로 추가 된 모든 키는 복제본이므로 블록이 호출됩니다. 결과적으로 해시의 모든 값은 expresion으로 바뀝니다.

+0

'expresion'은 질문에있는 원본 코드 (이미 오타가 있음)에 대한 참조입니다. – koffeinfrei

0

Hash#update은 첫 번째 매개 변수로 해시를, 두 번째 매개 변수로 선택 사항 블록을 사용합니다. 두 번째 매개 변수가 생략되면 메서드는 제공된 해시의 각 키 - 값 쌍을 내부적으로 반복하여 원래 해시로 병합합니다.

블록 (두 번째 매개 변수)이 제공되면 메서드는 완전히 똑같습니다. 제공된 해시의 각 키 - 값을 반복하고 병합합니다. 유일한 차이는 충돌이있는 곳입니다 (원래 해시에는 이미 특정 키에 대한 항목이 있습니다). 이 경우 충돌을 해결하기 위해 블록이 호출됩니다.

이 이해를 바탕으로 해시를 전달하면 모든 키 - 값에 루프가 발생하므로 update이 항상 작동합니다. .each으로 전화하는 것은 불필요합니다.

더 명확하게 보려면 #update 메서드의 소스 코드를 살펴보고 논리 분기에 rb_hash_foreach에 대한 내부 호출을 확인하십시오.

+0

충돌 (중복 키)이 발생한 경우 블록은 원래 해시가 업데이트되는 규칙입니까? 그래서 당신은 {key, value} value + = 1}과 같은 것을 말할 수 있습니까? 충돌에 대한 규칙을 만들어 원래 해시 값을 원래 해시 값과 두 번째 해시 값의 평균으로 업데이트 할 수 있습니까? 이 방법의 범위에 대한 아이디어를 얻으려고합니다.응답 해주셔서 감사합니다. – HectorOfTroy407

+0

문서를 보면 블록 아리에트가 충돌하는 키, 원래 값 및 새 값과 같은 3 개의 인수를 실제로 받아 들인다는 것을 알 수 있습니다. 그래서 네, 두 번째와 세 번째 인수의 평균을 취하면 그 결과를 얻을 수 있습니다 :'{| key, v1, v2 | (v1 + v2)/2}' – PinnyM