From: Srijayanth Sridhar Date: 2009-04-29T15:29:49+09:00 Subject: Re: Hash#map --000e0cd6ad7ebdb3480468abb40a Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit class Hash def new_map result = self.map do |k,v| r = yield v [k,r] end Hash[*result.flatten] end end a = {} a[2] = 4 a[3] = 6 b=a.new_map do |v| v+2 end puts b.class puts b.inspect yields: Hash {2=>6, 3=>8} Does this help? Jayanth On Wed, Apr 29, 2009 at 11:30 AM, Fredrik wrote: > Is there any good reason why Hash#map does not give back a Hash (Ruby > 1.8 but same in 1.9 as far as I know)? I often find myself writing > these kind of things: > > newhash = oldhash.inject({}) { |h,(k,v)| h[k] = some_operation(v); h } > > but that doesn't look pretty at all in my opinion. I want to just > write like this: > > newhash = oldhash.map { |k,v| some_operation(v) } > > I finally got around to change this behaviour for my own code, but are > all Ruby users supposed to invent this wheel on their own? Wouldn't it > be better if Hash#map behaved like this? Or is there something I am > missing? > > class Hash > def hashmap > self.inject({}) do |newhash, (k,v)| > newhash[k] = yield(k, v) > newhash > end > end > end > > > Regards, > Fredrik > > --000e0cd6ad7ebdb3480468abb40a--