Я хочу сделать что-то простое и понятное, например, min(5,10)
или Math.max(4,7)
. Есть ли в Ruby функции для этого?
Вы можете сделать
[5, 10].min
или
[4, 7].max
Они берутся из модуля Enumerable, поэтому все, что включает Enumerable
, будет иметь эти методы.
В версии 2.4 появились собственные методы Array#min
и Array#max
, которые намного быстрее методов Enumerable, потому что они пропускают вызов #each
.
EDIT
@nicholasklick упоминает другой вариант, Enumerable#minmax
, но на этот раз возвращающий массив [min, max]
.
[4, 5, 7, 10].minmax
=> [4, 10]
Вы можете использовать
[5,10].min
или
[4,7].max
Это метод для массивов.
Все эти результаты создают мусор в рьяных попытках справиться с более чем двумя аргументами. Я'd будет интересно посмотреть, как они выполняют по сравнению с хорошим 'ол:
def max (a,b)
a>b ? a : b
end
который кстати мой официальный ответ на ваш вопрос. :)
В дополнение к представленным ответам, если вы хотите преобразовать Enumerable#max в метод max, который может вызывать переменное число или аргументы, как в некоторых других языках программирования, вы можете написать:
def max(*values)
values.max
end
Выход:
max(7, 1234, 9, -78, 156)
=> 1234
Этот метод злоупотребляет свойствами оператора splat для создания объекта массива, содержащего все предоставленные аргументы, или пустого объекта массива, если аргументы не были предоставлены. В последнем случае метод вернет nil
, поскольку вызов Enumerable#max на пустом объекте массива возвращает nil
.
Если вы хотите определить этот метод в модуле Math, это должно помочь:
module Math
def self.max(*values)
values.max
end
end
Обратите внимание, что Enumerable.max по крайней мере в два раза медленнее по сравнению с троичным оператором (?:
). Более простой и быстрый метод см. в ответе Dave Morse's answer.
Если вам нужно найти макс/мин хэш, вы можете использовать #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]