Onze dagmethode #5: Enumerable#inject!
Geplaatst door Michiel de Mare ma, 11 feb 2008 06:40:00 GMT
Enumerable#inject is een geweldige en veelzijdige methode – zo veelzijdig dat ik hem regelmatig misbruik:
Neem bijvoorbeeld dit fragment:
ar_of_ar.inject(Hash.new(0)) do |h,a|
a.each {|x| h[x] += 1 }
h
end
# ik kon ook een lokale variabele gebruiken:
h = Hash.new(0)
ar_of_ar.each do |h,a|
a.each {|x| h[x] += 1 }
end
# in ruby 1.9 heb je Object#tap
Hash.new(0).tap do |h|
ar_of_ar.each do |a|
a.each {|x| h[x] += 1 }
end
end
Toch vind ik mijn inject
-oplossing het mooist – geen lokale variabelen en ook geen overbodig block. Laten we inject aanpassen met een versie die niet steeds de return-value van het block teruggeeft, maar een die het argument in inject
steeds aanpast. Als naam stel ik voor: inject!
module Enumerable
def inject!(memo)
each {|x| yield(memo,x) }
memo
end
end
ar_of_ar.inject!(Hash.new(0)){|h,a| a.each{|x| h[x] += 1}}