--.--.--

スポンサーサイト

カテゴリ: スポンサー広告

上記の広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書く事で広告が消せます。

今使っているVPS

2011.06.10

[Rails][Ruby]みんなで使おうtapp

カテゴリ: Rails

デバックのお友達tapp!!


rubyに標準のtapではないですよ?tappです!
pが2つです


そもそもtapってなに?


参考: [ruby]tapかわいいよtap


class Object
def tap
yield(self)
self
end
end

実装はこんだけ! なんとも単純な、そして奥深いメソッドです
ソースコードを拝借するとこんな使い方をしています


ary.map{|x| x**2}.tap{|a| p a}.select {|x| x>10 } # => [16]

メソッドチェインしていく際の途中結果を出力するのに使っています


こんなサンプルもありました
参考 : [Ruby]RubyのObject#tapメソッドの使い道。


[1].tap {|x| 5.times {|i| x << x.pop * i.succ } }[0]
# => 120

上記URLへいけばわかりますが、injectでも同等の機能が実現できます
ん?使い道なくね?


こういう使い方もあるようです
[Ruby]RbyのObject#tapメソッドの使い道がわかった。


まとめると、使い道がなかなか難しいメソッド
使うとしたらメソッドチェインの途中で結果を出力するくらい
つまり主にデバック用、でもうまく使うとかっこいいメソッド


tappの出番だ!


もう割り切ってtapはデバック用だ!という人はtappにしましょう


tappのインストール


gem install tapp

Gemfileであれば


gem 'tapp'

tappの使い方


さきほどの例を利用したサンプルを掲示します


[1,2,3,4,5].map{|x| x**2}.tap{|a| p a}.select {|x| x>10 }

結果


[1, 4, 9, 16, 25]
=> [16, 25]

1行目がtap{|a| p a}の結果です
2行目が式全体の結果です


tappを使うと...


[1,2,3,4,5].map{|x| x**2}.tapp.select {|x| x>10 }

短くなりました!なんというデバック専用メソッドでしょう


tappでこんなこともできます
x**2の部分の結果を逐次出したい場合は。。。


[1,2,3,4,5].map{|x| (x**2).tapp}.tapp.select {|x| x>10 }

結果は以下のようになります


1
4
9
16
25
[1, 4, 9, 16, 25]
=> [16, 25]

メソッドチェインしている場合に楽ちんですね


tapとtappのちょっと実用例


Rspecを例にとってtappでバグを含んだテストを見つける方法です


context "sizeメソッドでraiseする" do
it do
x=[1,2,3].stub(:size).and_raise(StandardError)
y=[1,2,3].tap{|o| o.stub(:size).and_raise(StandardError)}
expect{ x.tapp.size }.should raise_error
expect{ y.tapp.size }.should raise_error
end
end

この結果は以下のように出力されます


StandardError
[1, 2, 3]

このテストはPassします


しかし、sizeメソッドがraiseを送出することを想定してStubを定義したはずなのに、
stubの記述方法が間違っている為、
実はx.sizeを実行した際のNoMethodErrorでパスしていることになります


tappの結果をみるとxのppはStandardError,
yのppは[1,2,3]と想定どおりの配列であることが見て取れます


あまりよくわからないサンプルですね。。。
どちらかというとtapのサンプルになっています
オブジェクト定義とstub定義を同時に行うときにtapは便利だったりしますよ!
間違ってもxのようにしないように!


tappについて


Github
作者はursmの日記の人のようです

関連記事

今使っているVPS

この記事へのトラックバックURL
http://namakesugi.blog42.fc2.com/tb.php/108-2b39909a
この記事へのトラックバック
この記事へのコメント
管理者にだけ表示を許可する