Ruby

tap 面白いよ tap

More than 3 years have passed since last update.


既出ネタだけどがんばる。


tap かわいいよ tap

[Qiita]tap


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で無理矢理01に書き換えちゃえ←


最後に一言

この記事、何番煎じ?^q^