Ruby 2.6 の変更点 - Method と Proc

Ruby2.6アドベントカレンダーの12日目の記事です。

qiita.com

Method

Method#<<, Method#>> 追加

https://bugs.ruby-lang.org/issues/6284

このメソッドオブジェクトと他のメソッドやProc等(#call を持つオブジェクト)を続けて処理するようなProcオブジェクトを返します。

#<< は、他のオブジェクトの戻り値を引数としてこのメソッドオブジェクトを実行します。 #>> は、このメソッドオブジェクトの戻り値を引数として他のオブジェクトを実行します。

def hoge(s)
  s + 'abc'
end
fuga = ->(s) do
  s * 2
end
(method(:hoge) << fuga).call('012')  #=> "012012abc"
(method(:hoge) >> fuga).call('012')  #=> "012abc012abc"

Proc

Proc#<<, Proc#>> 追加

https://bugs.ruby-lang.org/issues/6284

Method#<<, Method#>> の Proc 版です。

hoge = ->(s) do
  s + 'abc'
end
fuga = ->(s) do
  s * 2
end
(hoge << fuga).call('012')  #=> "012012abc"
(hoge >> fuga).call('012')  #=> "012abc012abc"