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)