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のEnumerable#mapをもっと便利にしたいよ


=== Ruby関連電子書籍100円〜で好評発売中! ===

M’ELBORNE BOOKS

rack pack8 ruby_parallel



blog comments powered by Disqus
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS