追記
Ruby1.9で導入されたtapがこれだったのでこの記事は読まなくていいです.
@hitode909 tap
2011-05-16 11:54:53 via Tween to @hitode909
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本体の機能でこれと同じのがあるかもしれないけど知らないから作ったけど,知ってるひといたら教えてください.)