まじにめにどんなのがうれしいか書いてみる

あたりまえだったんだけど、ちょっとがっかりしてしまったこと - takkan_mのNo planな日常で、HashのmapがArrayでがっかりみたいに書いたんだけど、HashのmapはHashを返せと思うのは、僕だけじゃないのね。

ということで、いくつか案を考えてみた。

まず1

class Hash
   def map()
      self.inject({}) do |i,(k,v)|
         nk , nv = yield(k,v)
         i[nk] = nv
         i 
      end
   end
end

irb(main):010:0> hoge = {:a,1,:b,2,:c,3}
=> {:c=>3, :a=>1, :b=>2}
irb(main):011:0> hoge.map{|k,v| [k,(v+1)]}
=> {:c=>4, :a=>2, :b=>3}

これだと、keyの値も変えれて、もとのHashから、別のHashに写像している感じがする。でも、なんかラストが配列というのはいけていないきがするし(もともとのHashのmapが渡してくるブロック変数自体が配列なのも、正直うれしくないんだけど)、keyを書き換えたいなんてこと自体がほとんどないきがするなぁ。だいたい、keyが変わったものを参照するのってめんどい気がする。

というわけで、2

class Hash
   def map()
      self.inject({}) do |i,(k,v)|
         nv = yield(k,v)
         i[k] = nv
         i 
      end
   end
end

irb(main):024:0> hoge.map{|k,v| (v+2)}
=> {:c=>5, :a=>3, :b=>4}

ブロックの返り値が、そのときのkeyのvalueにする。これのほうがあつかいやすいか。

でも、ujihisaさんへのコメントにも返したけど、collect派の人的には、このHashの動作ってどうかんじるんだろうなぁ。mapだから写像って感じるから、Hashの写像はHashであってほしいって、僕は思うんだけど、あつめるってるじゃんっていう人は、どうなんだろう?