Как вы находите min / max с Ruby?
Я хочу сделать что-то простое и понятное, как min(5,10)
или Math.max(4,7)
. Есть функции для этого в Ruby?
5 ответов
можно сделать
[5, 10].min
или
[4, 7].max
они приехали из модуль Enumerable, так что все, что включает Enumerable
будут доступны эти методы.
v2.4 вводит собственный Array#min
и Array#max
, которые намного быстрее, чем методы Enumerable, потому что они пропускают вызов #each
.
редактировать
@nicholasklick упоминает другой вариант,Enumerable#minmax
, но на этот раз возврат массива [min, max]
.
[4, 7].minmax
=> [4, 7]
это не кажется очень интересным только с 2 значениями в исходном массиве, поэтому
[4, 5, 7, 10].minmax
=> [4, 10]
все эти результаты генерируют мусор в ревностной попытке обработать более двух аргументов. Мне было бы любопытно посмотреть, как они работают по сравнению с good ' ol:
def max (a,b)
a>b ? a : b
end
в дополнение к предоставленным ответам, Если вы хотите конвертировать перечисляемый#max в метод max, который может вызывать переменное число или аргументы, как и в некоторых других языках программирования, вы можете написать:
def max(*values)
values.max
end
выход:
max(7, 1234, 9, -78, 156)
=> 1234
это злоупотребляет свойствами оператора splat для создания объекта массива, содержащего все предоставленные аргументы, или пустого объекта массива, если аргументы не были предоставлены. В последнем случае метод будет возвращен nil
, С момента вызова перечисляемый#max на пустой массив возвращает объект nil
.
если вы хотите определить этот метод в модуле Math, это следует сделать трюк:
module Math
def self.max(*values)
values.max
end
end
обратите внимание, что перечисляемый.Макс, по крайней мере, в два раза медленнее по сравнению с тернарный оператор (?:
). См.ответ Дэйва морса для более простого и быстрого метода.
Если вам нужно найти макс/мин хэш, вы можете использовать #max_by
или #min_by
people = {'joe' => 21, 'bill' => 35, 'sally' => 24}
people.min_by { |name, age| age } #=> ["joe", 21]
people.max_by { |name, age| age } #=> ["bill", 35]