Skip to content
Browse files

Object#tap for Ruby < 1.8.7

  • Loading branch information...
1 parent 17da45b commit 0f9e65b71f9af30dac17689e81f4353e9fcac5b6 @jeremy jeremy committed
View
3 activesupport/CHANGELOG
@@ -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
15 activesupport/lib/active_support/core_ext/object/misc.rb
@@ -40,6 +40,21 @@ def returning(value)
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
8 activesupport/test/core_ext/object_ext_test.rb
@@ -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

0 comments on commit 0f9e65b

Please sign in to comment.
Something went wrong with that request. Please try again.