提交 10fe6a6d 编写于 作者: A Adam Keys 提交者: Michael Koziarski

Add each_with_object from 1.9 for a more convenient alternative to inject.

Signed-off-by: NMichael Koziarski <michael@koziarski.com>
[#962 state:committed]
上级 b36d0009
......@@ -64,6 +64,26 @@ def sum(identity = 0, &block)
end
end
# Iterates over a collection, passing the current element *and* the
# +memo+ to the block. Handy for building up hashes or
# reducing collections down to one object. Examples:
#
# %w(foo bar).each_with_object({}) { |str, hsh| hsh[str] = str.upcase } #=> {'foo' => 'FOO', 'bar' => 'BAR'}
#
# *Note* that you can't use immutable objects like numbers, true or false as
# the memo. You would think the following returns 120, but since the memo is
# never changed, it does not.
#
# (1..5).each_with_object(1) { |value, memo| memo *= value } # => 1
#
def each_with_object(memo, &block)
returning memo do |memo|
each do |element|
block.call(element, memo)
end
end
end unless [].respond_to?(:each_with_object)
# Convert an enumerable to a hash. Examples:
#
# people.index_by(&:login)
......
......@@ -58,6 +58,11 @@ def test_empty_sums
assert_equal Payment.new(0), [].sum(Payment.new(0))
end
def test_each_with_object
result = %w(foo bar).each_with_object({}) { |str, hsh| hsh[str] = str.upcase }
assert_equal({'foo' => 'FOO', 'bar' => 'BAR'}, result)
end
def test_index_by
payments = [ Payment.new(5), Payment.new(15), Payment.new(10) ]
assert_equal({ 5 => payments[0], 15 => payments[1], 10 => payments[2] },
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册