5 ответов:
можно сделать
[5, 10].minили
[4, 7].maxони приехали из модуль Enumerable, так что все, что включает
Enumerableбудут доступны эти методы.v2. 4 вводит собственный
Array#minиArray#max, которые намного быстрее, чем методы Enumerable, потому что они пропускают вызов#each.EDIT
@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_bypeople = {'joe' => 21, 'bill' => 35, 'sally' => 24} people.min_by { |name, age| age } #=> ["joe", 21] people.max_by { |name, age| age } #=> ["bill", 35]
Comments