Respostas:
Você pode fazer
[5, 10].min
ou
[4, 7].max
Eles vêm do módulo Enumerable , portanto, qualquer coisa que inclua Enumerable
terá esses métodos disponíveis.
A v2.4 introduz os métodos own Array#min
e Array#max
, que são muito mais rápidos que os métodos do Enumerable porque ignoram as chamadas #each
.
@nicholasklick menciona outra opção, Enumerable#minmax
mas desta vez retornando uma matriz de [min, max]
.
[4, 5, 7, 10].minmax
=> [4, 10]
std::max(4, 7)
tem mais "pontuação" do que [4, 7].max
?
std::max
pode ser importado para o seu espaço para nome, então ele se torna max(4, 7)
. Esperar; olhando para cima, eu já disse isso.
Você pode usar
[5,10].min
ou
[4,7].max
É um método para matrizes.
Todos esses resultados geram lixo em uma tentativa zelosa de lidar com mais de dois argumentos. Eu ficaria curioso para ver como eles se saem em comparação com o bom:
def max (a,b)
a>b ? a : b
end
que é, a propósito, a minha resposta oficial à sua pergunta.
[a,b].max
, mas ainda não está claro se é mais rápido que a implementação acima. blog.bigbinary.com/2016/11/17/…
Se você precisar encontrar o máximo / min de um hash, poderá usar #max_by
ou#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]
Além das respostas fornecidas, se você quiser converter Enumerable # max em um método max que possa chamar um número ou argumentos variáveis, como em algumas outras linguagens de programação, você pode escrever:
def max(*values)
values.max
end
Resultado:
max(7, 1234, 9, -78, 156)
=> 1234
Isso abusa das propriedades do operador splat para criar um objeto de matriz que contenha todos os argumentos fornecidos ou um objeto de matriz vazio se nenhum argumento for fornecido. Neste último caso, o método retornará nil
, pois a chamada Enumerable # max em um objeto de matriz vazio será retornada nil
.
Se você deseja definir esse método no módulo Math, faça o seguinte:
module Math
def self.max(*values)
values.max
end
end
Observe que Enumerable.max é, pelo menos, duas vezes mais lento em comparação com o operador ternário ( ?:
) . Veja a resposta de Dave Morse para um método mais simples e rápido.
def find_largest_num(nums)
nums.sort[-1]
end