既出ネタだけどがんばる。
etc..
Object # tap
Objectクラスに定義されているので、どのクラス(いかなるオブジェクト)でも使用できる!はず...。
リファレンス
キホン
{ }
ブロック内で処理を実行し、処理結果に関わらずレシーバ自身を返すメソッドです。
以下3点が解れば大丈夫かと。
①空処理
self.tap{}
# => self
②内部処理サンプル
self.tap{ puts "hoge" }
# => self
# `hoge`が標準出力される
③戻り値が欲しい時
self.tap{ break :hoge }
# => :hoge
何に使うの?
{ }
ブロック内の処理結果に関わらず、レシーバ自身を返すので
デバッグ等の処理を行いながらメソッドチェーンできる。
ruby
( 1 .. 5 )
.tap{|obj| puts obj.class}
.to_a.tap{|obj| puts obj.class}
#=> [1, 2, 3, 4, 5]
出力結果
Range
Array
デバッグ用
途中途中で出力するのも面白い
object
.tap{|obj| p obj }
.method1.tap{|obj| p obj }
.method2.tap{|obj| p obj }
これに関しては tapp っていうのを見つけた。
ソースコード@Github
つかいかた@Fc2
これはひどい
1行FizzBuzz
1.upto( 100 ){| num |
text = ''
num
.tap{|n| text += 'fizz' if ( n%3==0 )}
.tap{|n| text += 'buzz' if ( n%5==0 )}
.tap{|n| text += n.to_s if text.empty? }
.tap{ puts text }
}
考え方は一緒だった・・・。
[Qiita]TapでFizzBuzz
個人的な使い方とか
気が向いたら追加する予定……
その1
s = 'a'
s.tap{|t| t.sub!( 'a', 'b' )}
# => 'b'
当然だけど、変数s
の中身は'b'
に書き変わるよ。
sub!
は破壊的メソッドだからね!←
その2
n = rand( 10 )
1 / n.tap{|t| break 1 if t.zero? }
0
で除算するとモチロンZeroDivisionError
が発生するよ!
エラーを防ぐためにtap
で無理矢理0
を1
に書き換えちゃえ←
最後に一言
この記事、何番煎じ?^q^