読者です 読者をやめる 読者になる 読者になる

mapにも引数あっても良いんじゃないだろうか

ruby

String#eachのように引数をとれるeachのときにわざわざenum_for使うのもめんどくさいので、mapが引数取れてもいいんじゃないかと思えるのは自分だけだろうか。*1

module Enumerable
  def map(*args, &block)
    arr = []
    each(*args) do |i|
      arr.push(block.call(i))
    end
    arr
  end
end

こうするとこんなことが出来るようになって便利そう。

"abcde\n\nabcde\n".map(""){|i| "<p>#{i.chomp.chomp}</p>\n" }
  #=> ["<p>abcde</p>\n", "<p>abcde</p>\n"]

とはいってもこれ以外の例はあまり思いつかないのだけど。なんか良さそうな例があればTBください。

そうなってくると、find、find_all、reject、inject、grepなども引数を考慮するべきとなってしまってめんどくさいのかなぁ。

eachの引数は一番最後で仮引数で受けてそれを委譲するという形で大丈夫そうな気もするけど。

どちらかというとどんなときにeachは引数を取れるようにすると良いだろうかという議論もありそうな気がした。

主要なやつがeachの引数を取れるようになったらeach_*といった感じのメソッドを書くよりもeach(:line)とかeach(:with_index)とかいった感じでeachの挙動を変えられた方がEnumrator使うより綺麗に書けそうな気もする。*2

*1:ML検索すればありそうな気もするけど

*2:eachのコードのメンテナンスが大変そうだけど