まじにめにどんなのがうれしいか書いてみる
あたりまえだったんだけど、ちょっとがっかりしてしまったこと - 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であってほしいって、僕は思うんだけど、あつめるってるじゃんっていう人は、どうなんだろう?