Вопрос

Я хочу сделать что-то простое и понятное, например min(5,10), или Math.max(4,7).Есть ли в Ruby функции для этого?

Это было полезно?

Решение

Ты можешь сделать

[5, 10].min

или

[4, 7].max

Они происходят из Перечислимый модуль, поэтому все, что включает в себя Enumerable будут доступны эти методы.

v2.4 представляет собственные Array#min и Array#max, которые работают намного быстрее, чем методы Enumerable, поскольку пропускают вызов #each.

РЕДАКТИРОВАТЬ

@nicolasklick упоминает еще один вариант: Enumerable#minmax, но на этот раз возвращая массив [min, max].

[4, 5, 7, 10].minmax
=> [4, 10]

Другие советы

Вы можете использовать

[5,10].min 

или

[4,7].max

Это метод для массивов.

Все эти результаты порождают мусор в ревностной попытке обработать более двух аргументов.Мне было бы любопытно посмотреть, как они работают по сравнению со старыми добрыми:

def max (a,b)
  a>b ? a : b
end

кстати, это мой официальный ответ на ваш вопрос.:)

В дополнение к предоставленным ответам, если вы хотите конвертировать Перечисляемый#макс в метод max, который может вызывать число переменных или аргументы, как в некоторых других языках программирования, вы можете написать:

def max(*values)
 values.max
end

Выход:

max(7, 1234, 9, -78, 156)
=> 1234

При этом используются свойства оператора splat для создания объекта массива, содержащего все предоставленные аргументы, или пустого объекта массива, если аргументы не были предоставлены.В последнем случае метод вернет nil, с момента звонка Перечисляемый#макс для пустого объекта массива возвращается nil.

Если вы хотите определить этот метод в модуле Math, это должно помочь:

module Math
 def self.max(*values)
  values.max
 end
end

Обратите внимание, что Enumerable.max, по крайней мере, в два раза медленнее по сравнению с тернарным оператором (?:).Видеть Ответ Дэйва Морса для более простого и быстрого метода.

Если вам нужно найти максимум/мин хеша, вы можете использовать #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]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top