Ruby tap method

2013年8月26日 22:32

tap定义

class Object 
  def tap 
    yield self 
    self 
  end 
end

Usage

1

blah.sort.grep( /foo/ ).map { |x| x.blah }
传统调试方法:
xs = blah.sort.grep( /foo/ )
p xs

# do whatever we had been doing with the original expression
xs.map { |x| x.blah }
使用tap:
blah.sort.grep( /foo/ ).tap { |xs| p xs }.map { |x| x.blah }

2

( k + 1 ) / ( ( q - t ) / 2 )
传统调试方法:
i = ( q - t )
p i
( k + 1 ) / ( i / 2 )
使用tap:
( k + 1 ) / ( ( q - t ).tap { |i| p i } / 2 )

3

def blah
  @things.map { |x|
    x.length
  }.inject( 0 ) { |a, b|
    a + b
  }
end
传统调试方法:
def blah
  sum = @things.map { |x|
    x.length
  }.inject( 0 ) { |a, b|
    a + b
  }
  p sum
  sum
end
使用tap:
def blah
  @things.map { |x|
    x.length
  }.inject( 0 ) { |a, b|
    a + b
  }.tap { |sum| p sum }
end