class Proc %w[ + - * / ** % | & ^ > < >= <= == <=> >> << =~ != !~ ].map{|i| i.to_sym }.each do |op| define_method(op) do |rhs| apply_binary(rhs,&op) end end private def apply_binary rhs raise "block is needed" unless block_given? Proc.new{|*args| yield self.call(*args),rhs.call(*args) } end end
これにより,Proc クラスのオブジェクト a, b に対して,a + b とすると a と b をそれぞれ呼び出した後に演算子を適用する Proc オブジェクトを新たに生成できます.
自分で言っていてよく分からないので具体例を.
a = lambda{|i| i * 3 } b = lambda{|i| i / 2 } # これは c = lambda{|i| i*3 + i/2 } と同じ c = a + b c.call 4 #=> 14
こんな感じになります.