2016-07-28 19 views
0

에 배열을 수정하기위한 I는 다음과 같습니다ruby ​​.map! 각 장소

article_results.keys do |key| 
    article_results[key].map! do |a| 
    a[:filename] = c.filename 
    a[:sitename] = c.site_name 
    a 
    end 
end 

내가 동적 해시 내의 각 배열의 각 요소에 추가 할, 그러나 때 어떤 이유로 a[:filename]a[:sitename]가 비어 있습니다으로 익숙한.

대신 .each을 사용해야하는지 알고 싶습니다. 또한 두 가지 모두 부작용으로 사용할 수 있기 때문에 주요 차이점을 알고 싶습니다.

저는 이것을 루비 1.8.7을 사용하고 있습니다. 그래서 버전 간 차이점을 알고 있으면 좋을 것입니다 (1.8.7 - 1.9+).

p.s. .each.map의 차이점은 무엇입니까, 구체적으로 묻는 것은 .map!입니다.

답변

0

#map은 배열에 비해 해시에 대한 의미가 조금 다릅니다 (그리고 나는 루비 버전간에 매우 일관성이 없다고 생각합니다). 일반적으로 일부 작업의 결과로 배열을 찾고 있다면 - #map 당신의 친구가 당신이 어떤 동작의 결과로 해시를 원하는 그러나 경우 - 당신은 #reduce 더 나을 것 :

article_results.reduce({}) do |hash, (key, value)| 
    hash.merge(key => value.merge(filename: c.filename, 
           sitename: c.sitename)) 
end 

양자 택일 경우 당신은 당신의 코드가 얼마나 "기능"상관 없어, 당신은 #each 사용할 수 있습니다

article_results.each do |key, value| 
    article_results[key].merge!(filename: c.filename, 
           sitename: c.sitename) 
end 
+0

을 나는 (I 현재 사용하도록 강요 해요)와 1.9+, 나는 '1.8.7 차이가있다 잊고 유지 op에 그것을 추가 할 것입니다. 주사처럼 보이지 않게하는 건 똑같은거야? 또한 article_results는 setter 및 getter와 같은 해시를 사용하여 추가 데이터를 추가하는 객체 배열의 해시입니다. – Thermatix

+0

맞음, 줄이기는 주입 할 별칭입니다 (또는 그 반대). 그것은 단지 일관된 명명의 문제입니다.지도는 축소되고, 삽입은 수집과 함께 진행됩니다. 질문에서 코드에서 'artice_results'는 해시 (또는 해시처럼 동작하는 객체)의 해시이므로'merge! '가 작동해야합니다. 그렇지 않다면 - 직접'[] = '를 사용하십시오. – keymone

+0

실제로'article_results'가 배열의 해쉬이면'map! '코드가 정확하고'c.filename'이 유효한지 확인해야합니다. 와 .cys'.keys'는 블록을 사용하지 않습니다.'.keys.each'가되어야합니다. – keymone