map の拡張(Ruby)

RubyのEnumerable#mapをもっと便利にしたいよ - hp12c
id:keysberry さんが考え出されました。おもしろいですねえ。こんなシンプルな実装だけれど、よくできている。勉強になります。また、実際便利そう。

感謝のコピペしておきますね。

module Enumerable
  def mapp(op=nil, *args, &blk)
    op ? map { |e| op.intern.to_proc[e, *args]} : map(&blk)
  end
end

こんなにシンプル。

使い方はこんな感じ(これもコピペ)。

[1, 2, 3].mapp(:+, 10) # => [11, 12, 13]

(1..5).mapp(:**, 2) # => [1, 4, 9, 16, 25]

[[1,2,3,4], [5,6,7,8], [9,10,11,12]].mapp(:last, 2) # => [[3, 4], [7, 8], [11, 12]]

["ruby", "python", "lisp", "haskell"].mapp(:[], -2, 2) # => ["by", "on", "sp", "ll"]

きれいですねえ。

なお、ブロックを渡せばそのまま map としても使えるという。ホントよくできています。

参考:
instance method String#intern (Ruby 2.2.0)
instance method Symbol#intern (Ruby 2.2.0)
instance method Symbol#to_proc (Ruby 2.2.0)