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を調べるコストがかかる。