Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

AS guide: documents Enumerable#each_with_object

  • Loading branch information...
commit 3ed6b3a8b310598b391d004514ee72c58171d637 1 parent 340be9b
Xavier Noria fxn authored
Showing with 24 additions and 0 deletions.
  1. +24 −0 railties/guides/source/active_support_overview.textile
24 railties/guides/source/active_support_overview.textile
View
@@ -847,6 +847,30 @@ def observed_subclasses
end
</ruby>
+h4. +each_with_object+
+
+The +inject+ method offers iteration with an accumulator:
+
+<ruby>
+[2, 3, 4].inject(1) {|acc, i| product*i } # => 24
+</ruby>
+
+The block is expected to return the value for the accumulator in the next iteration, and this makes building mutable objects a bit cumbersome:
+
+<ruby>
+[1, 2].inject({}) {|h, i| h[i] = i**2; h} # => {1 => 1, 2 => 4}
+</ruby>
+
+See that spurious "+; h+"?
+
+Active Support backports +each_with_object+ from Ruby 1.9, which addresses that use case. It iterates over the collection, passes the accumulator, and returns the accumulator when done. You normally modify the accumulator in place. The example above would be written this way:
+
+<ruby>
+[1, 2].each_with_object({}) {|i, h| h[i] = i**2} # => {1 => 1, 2 => 4}
+</ruby>
+
+WARNING. Note that the item of the collection and the accumulator come in different order in +inject+ and +each_with_object+.
+
h3. Extensions to +Array+
h4. Accessing
Please sign in to comment.
Something went wrong with that request. Please try again.