LoginSignup
93
57

More than 3 years have passed since last update.

tap 面白いよ tap

Last updated at Posted at 2014-06-03

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

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^

93
57
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
93
57