Add Enumerable#max_by

This commit is contained in:
Jun Hiroe
2014-03-22 13:46:53 +09:00
parent 7c82b9e1bf
commit af7db89aa3
2 changed files with 39 additions and 0 deletions
+35
View File
@@ -267,4 +267,39 @@ module Enumerable
ary
end
alias collect_concat flat_map
##
# call-seq:
# enum.max_by {|obj| block } -> obj
# enum.max_by -> an_enumerator
#
# Returns the object in <i>enum</i> that gives the maximum
# value from the given block.
#
# If no block is given, an enumerator is returned instead.
#
# %w[albatross dog horse].max_by { |x| x.length } #=> "albatross"
def max_by(&block)
return to_enum :max_by unless block_given?
first = true
max = nil
max_cmp = nil
self.each do |val|
if first
max = val
max_cmp = block.call(val)
first = false
else
if cmp = block.call(val) > max_cmp
max = val
max_cmp = cmp
end
end
end
max
end
end
+4
View File
@@ -76,3 +76,7 @@ assert("Enumerable#flat_map") do
assert_equal [1, -1, 2, -2, 3, -3, 4, -4], [1, 2, 3, 4].flat_map { |e| [e, -e] }
assert_equal [1, 2, 100, 3, 4, 100], [[1, 2], [3, 4]].flat_map { |e| e + [100] }
end
assert("Enumerable#max_by") do
assert_equal "albatross", %w[albatross dog horse].max_by { |x| x.length }
end