Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! ruby -Ks
- # -*- coding: Shift_JIS -*-
- =begin
- Object#tap
- 存在は知っていたけど、どんなシーンで使えるのかよくわからなくて使ったこと無かったんですが・・・
- むしろ、あらゆるシーンで使えるメソッドでした。
- まず、1.8.7から増えたとはいうものの、未実装verでも簡単に定義できます。
- class Object
- def tap
- yield self
- self
- end
- end
- これだけ
- ブロック引数に自身を渡し、返り値も自身とする
- これによって破壊的操作やデバッグを使いやすくし(メソッドチェーンの友)、多くのシーンで変数や返り値の宣言を減らしてくれます。
- =end
- tmp1 = [1, 2, 1]
- puts '------------------'
- p tmp1.uniq
- p tmp1.uniq!
- puts '------------------'
- #重複削られた後の配列が返りましたよね?
- #これは、通常特に問題にならん動作でしょう
- #問題なのは・・・
- p tmp1.uniq!
- puts '------------------'
- #往々にしてruby標準の破壊的メソッドは、操作対象の無かった場合にnilを返します。
- #きっと意味がある(或いは使わせたくない)んでしょうが、メソッドチェーン時には使いづらい挙動でもあります。(最初のうちよく引っかかりました。)
- #こんなシーンでも、tapを使えば返り値がselfとなることを保証してくれます。
- p tmp1.tap{|o|o.uniq!}
- puts '------------------'
- #ただまぁ、個人的にはメソッドが増えた割にコードの意味が分かりやすくなっていないので、よっぽど軽量化考えてるわけでもないなら非破壊のuniqを使いたいんですけど・・・
- #とりあえず、tapの使いどころはこれだけじゃありませんでした。
- %w(Cofee Cocoa CCLemon CDE).collect{|str|str.sub('C','c')}.select{|str|/o/ =~ str}.each do |str|
- puts str
- end
- puts '------------------'
- #こんな感じでメソッドチェーンを使ってるときに、途中経過を確かめたくなったとします。
- #そういう時、フツーのやり方だと
- after_sub_strings = %w(Cofee Cocoa CCLemon CDE).collect{|str|str.sub('C','c')}
- p after_sub_strings
- after_sub_strings.select{|str|/o/ =~ str}.each do |str|
- puts str
- end
- puts '------------------'
- #こうやって、一度ばらしてやらなきゃいけません。
- #そこでtap
- %w(Cofee Cocoa CCLemon CDE).collect{|str|str.sub('C','c')}.tap{|now|p now}.select{|str|/o/ =~ str}.each do |str|
- puts str
- end
- puts '------------------'
- #必ずしも破壊的に使う必要はないわけですね
- #これならチェーン途中の流れを簡単に確かめられるし、不要になってもそこだけ外せば済みます。
- #脱着御免のリピータかまして、パケットキャプチャをやってるようなイメージ。
- #tapっていうメソッド名の由来は「盗聴」からみたいなことみかけた気がするんですが、それはおそらくこういう用途を指したんじゃないでしょうか
Add Comment
Please, Sign In to add comment