Я хочу использовать min(5,10)
или Math.max(4,7)
. Есть ли в Ruby функции для этого?
Как найти минимум / максимум с Ruby
Ответы (5)
Ты можешь сделать
[5, 10].min
or
[4, 7].max
Они поступают из модуля Enumerable, поэтому все, что включает Enumerable
, будет иметь эти доступные методы.
v2.4 вводит собственные Array#min
и Array#max
, которые намного быстрее, чем методы Enumerable, потому что они пропускают вызов #each
.
@nicholasklick упоминает другой вариант, Enumerable#minmax
, но на этот раз возвращается массив [min, max]
.
[4, 5, 7, 10].minmax
=> [4, 10]
(defun minmax (&rest args) (values (apply #'min args) (apply #'max args)))
Теперь: (minmax 3 4 5 7 1 9 2)
возвращает два возвращаемых значения: 1 и 9.
- person Kaz; 22.02.2014
std::max(4, 7)
знаков препинания больше, чем в [4, 7].max
?
- person tckmn; 25.03.2014
std::max
можно импортировать в ваше пространство имен, так что оно становится просто max(4, 7)
. Ждать; посмотрев выше, я вижу, что уже сказал это.
- person Kaz; 25.03.2014
Ты можешь использовать
[5,10].min
or
[4,7].max
Это метод для массивов.
Все эти результаты создают мусор в усердной попытке обработать более двух аргументов. Мне было бы любопытно посмотреть, как они работают по сравнению со старыми добрыми:
def max (a,b)
a>b ? a : b
end
что, кстати, является моим официальным ответом на ваш вопрос.
[a,b].max
, но до сих пор не ясно, быстрее ли это, чем описанная выше реализация. blog.bigbinary. ru / 2016/11/17 /
- person Dave Morse; 27.05.2017
Если вам нужно найти максимальное / минимальное значение хэша, вы можете использовать #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]
В дополнение к предоставленным ответам, если вы хотите преобразовать 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, по крайней мере, в два раза медленнее по сравнению с тернарным оператором (?:
). См. ответ Дэйва Морса для более простого и быстрого метода.