20 April 2014
落ちていくRubyistのためのMethopオブジェクト
RubyistはどんどんLazyになっていってmapにブロック渡すのも面倒という古今です。
こう書けばいいところを、
%w(ybur si citsatnaf egaugnal).map { |str| str.reverse } # => ["ruby", "is", "fantastic", "language"]
こう書いて、
%w(ybur si citsatnaf egaugnal).map(&:reverse) # => ["ruby", "is", "fantastic", "language"]
堕落していきます。
いや、mapだけじゃありません。ブロック取るメソッド全般にそれは蔓延しています。
require "prime"
(1..100).select(&:prime?) # => [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
%w(red yellow green white blue black).uniq(&:size) # => ["red", "yellow", "green", "blue"]
で、更に落ちていって引数を渡そうと試み、
%w(ruby violin novel).map(&:+, 'ist') # =>
# ~> -:1: syntax error, unexpected ',', expecting ')'
(1..10).select(&:>, 5) # =>
# ~> -:1: syntax error, unexpected ',', expecting ')'
死ぬのです..。
Methopクラス
そんな悲しい末路のあなたのため(僕のため?)にMethopクラス
なるものを作ったのでなんとか堕落しつつも末永く生きていってください…。
class Methop
def self.[](method)
new(method).build
end
def initialize(method)
@method = method
end
def build
->arg, obj{ obj.send(@method, arg) }.curry
end
end
Methop.[]
がカリー化したProcオブジェクトを返します。
このように使います。
Plus = Methop[:+]
%w(ruby violin novel).map(&Plus['ist']) # => ["rubyist", "violinist", "novelist"]
[1, 5, 10].map(&Plus[2]) # => [3, 7, 12]
Bigger = Methop[:>]
(1..10).select(&Bigger[5]) # => [6, 7, 8, 9, 10]
もちろん、直接渡してもいいです。
(1..10).map(&Methop[:**][2]) # => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
%w(red yellow green white blue black).select(&Methop[:match][/bl/]) # => ["blue", "black"]
いや、ブロック書こうよ..。
関連記事:
=== Ruby関連電子書籍100円〜で好評発売中! ===
blog comments powered by Disqus