34
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

参考サイト

34
32
0

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
34
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?