mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Add Enumerable#max_by
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user