Object#tap for Ruby < 1.8.7

This commit is contained in:
Jeremy Kemper
2009-01-07 13:19:48 -08:00
committed by Yehuda Katz
parent b1530545d2
commit c2d23affad
3 changed files with 26 additions and 0 deletions

View File

@@ -1,5 +1,8 @@
*2.3.0 [Edge]*
* Object#tap shim for Ruby < 1.8.7. Similar to Object#returning, tap yields self then returns self. [Jeremy Kemper]
array.select { ... }.tap(&:inspect).map { ... }
* TimeWithZone#- gives correct result with wrapped DateTime, and with DateTime argument [Geoff Buesing]
* Updated i18n gem to version 0.1.1 #1635 [Yaroslav Markin]

View File

@@ -40,6 +40,21 @@ class Object
value
end
# Yields <code>x</code> to the block, and then returns <code>x</code>.
# The primary purpose of this method is to "tap into" a method chain,
# in order to perform operations on intermediate results within the chain.
#
# (1..10).tap { |x| puts "original: #{x.inspect}" }.to_a.
# tap { |x| puts "array: #{x.inspect}" }.
# select { |x| x%2 == 0 }.
# tap { |x| puts "evens: #{x.inspect}" }.
# map { |x| x*x }.
# tap { |x| puts "squares: #{x.inspect}" }
def tap
yield self
self
end unless Object.respond_to?(:tap)
# An elegant way to factor duplication out of options passed to a series of
# method calls. Each method called in the block, with the block variable as
# the receiver, will have its options merged with the default +options+ hash

View File

@@ -0,0 +1,8 @@
require 'abstract_unit'
class ObjectExtTest < Test::Unit::TestCase
def test_tap_yields_and_returns_self
foo = Object.new
assert_equal foo, foo.tap { |x| assert_equal foo, x; :bar }
end
end