hitode909の日記

趣味はマリンスポーツですの日記です

gem then(メソッドチェインをフォークするgem)

追記

Ruby1.9で導入されたtapがこれだったのでこの記事は読まなくていいです.


tapかわいいよtap - (rubikitch loves (Emacs Ruby CUI Books))
instance method Object#tap


Rubyを書いてて,本当は1つのメソッドチェインで書けるけど,途中で何かしたいために,変数に代入してメソッドチェインを中断することがあるのが,不便だった.


例えば,Arrayをuniqしてreverseした結果を表示したいとき,こう書ける.

p [1,2,3,3].uniq.reverse

メソッドチェイン1回で書けてすっきりしてる.


ここで,uniqした結果を表示したくなったときは,一度変数に代入してから表示する必要がある.

list = [1,2,3,3].uniq
p list
p list.reverse

本当はつながってるはずの一連の処理が分断されてしまう,既に同じスコープにlistという変数があって気付かず上書きしてしまうとかも有り得るので,あんまりよくない.


そこで,thenというgemを作った.


Object#thenというメソッドが定義されて,メソッドチェインの途中で,流れてきたオブジェクトに対してブロックを適用できる.
thenの定義は以下で,ブロックをselfに適用して,selfを返す.

class Object
  def then
    yield self
    self
  end
end


thenを使うと,さっきのがこう書ける.

require 'then'
p [1,2,3,3].uniq.then{|list|
  p list
}.reverse

thenの引数のブロックでuniq直後のオブジェクトを操作できる.
then内のブロックで破壊的操作をしなければ,uniq直後のオブジェクトがそのままreverseに渡る.
メソッドチェインの途中にいくらでも処理を挟んでいけるし,スコープに変数を増やさず済む.



gem install thenでインストールできる.

gem install then


thenを使えば一度も変数代入せずにプログラムを書けそう.


(Ruby本体の機能でこれと同じのがあるかもしれないけど知らないから作ったけど,知ってるひといたら教えてください.)