Ruby

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

More than 3 years have passed since last update.

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


参考サイト