1. Qiita
  2. 投稿
  3. Ruby

Object#tapでローカル変数を減らす。

  • 28
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Object#tapを知らなかったのでメモ。

Class: Object (Ruby 2.1.1) #tap

tap.rb
class Object
  def tap
    yield(self)
    self
  end
end

上記のとおり、ブロックにselfを渡してselfを返すメソッド。
tapは「盗聴」という意味なのでオブジェクトの中身を覗き見るためのメソッドなんだと思う。[1,2,3].tap { |ary| puts ary } みたいな。
で、これをうまく使えば一時的な変数を減らせる。

たとえば下記のようなメソッドを

fizzbuzz.rb
def fizzbuzz(n)
  ret = ""
  ret << "Fizz" if n % 3 == 0
  ret << "Buzz" if n % 5 == 0
  ret.empty? ? n : ret
end

tapを使えばこんな感じで書き換えられる。

fizzbuzz_with_tap.rb
def fizzbuzz(n)
  "".tap do |ret|
    ret << "Fizz" if n % 3 == 0
    ret << "Buzz" if n % 5 == 0
    break n if ret.empty?
  end
end

ブロック変数、つまりtapのレシーバに対して破壊的変更を加えてやるというのがポイントだと思う。もっとも、breakを使えばその引数を戻り値にできる。
もっと面白い使い方もできるようだけど、やりすぎると理解しにくいコードになるのでほどほどに。

メリット

  • ローカル変数を減らせる。

デメリット

  • tapを知らない人が読んだらtapを調べるコストがかかる。

参考サイト