mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
Add Enumerable#index_by
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4491 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
@@ -30,4 +30,19 @@ module Enumerable #:nodoc:
|
||||
def sum
|
||||
inject(0) { |sum, element| sum + yield(element) }
|
||||
end
|
||||
|
||||
# Convert an enumerable to a hash. Examples:
|
||||
#
|
||||
# people.index_by(&:login)
|
||||
# => { "nextangle" => <Person ...>, "chade-" => <Person ...>, ...}
|
||||
# people.index_by { |person| "#{person.first_name} #{person.last_name}" }
|
||||
# => { "Chade- Fowlersburg-e" => <Person ...>, "David Heinemeier Hansson" => <Person ...>, ...}
|
||||
#
|
||||
def index_by
|
||||
inject({}) do |accum, elem|
|
||||
accum[yield(elem)] = elem
|
||||
accum
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,4 +1,5 @@
|
||||
require 'test/unit'
|
||||
require File.dirname(__FILE__) + '/../../lib/active_support/core_ext/symbol'
|
||||
require File.dirname(__FILE__) + '/../../lib/active_support/core_ext/enumerable'
|
||||
|
||||
Payment = Struct.new(:price)
|
||||
@@ -24,4 +25,13 @@ class EnumerableTests < Test::Unit::TestCase
|
||||
assert_equal 30, payments.sum(&:price)
|
||||
assert_equal 60, payments.sum { |p| p.price * 2 }
|
||||
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]},
|
||||
payments.index_by(&:price)
|
||||
)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user