2009-08-31 20 views

Odpowiedz

582

Można zrobić

[5, 10].min 

lub

[4, 7].max 

Pochodzą one z Enumerable module, więc wszystko, co zawiera Enumerable będą miały te metody dostępne.

EDIT

@nicholasklick wspomina inną opcję, Enumerable#minmax, ale tym razem powracającego tablicę [min, max].

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

Nie wydaje się bardzo interesujący z tylko 2 wartości w początkowym tablicy, więc

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

To takie piękne! – Ziggy

+8

Lub po prostu wykonaj http://www.ruby-doc.org/core-2.0/Enumerable.html#method-i-minmax – nicholasklick

+0

Dzięki @nicholasklick, właśnie zaktualizowałem moją odpowiedź. Nawet nie wiedział, że istnieje! – theIV

45

Można użyć

[5,10].min 

lub

[4,7].max 

To metoda dla tablic.

+18

Technicznie jest to metoda dla enumerables, a nie array. – meagar

18

Oprócz dostarczonych odpowiedzi, jeśli chcesz przekonwertować Enumerable#max do max metody, która może wywołać szereg zmiennych lub argumentów, podobnie jak w innych językach programowania, można napisać:

def max(*values) 
values.max 
end 

Output:

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

tEGO nadużywa właściwości operatora ikona celu utworzenia obiektu tablicy zawierającej wszystkie argumenty świadczone lub pustego przedmiotu tablicy jeśli nie argumenty były. W tym ostatnim przypadku metoda zwróci nil, ponieważ wywołanie Enumerable#max na pustym obiekcie tablicy zwróci nil.

Jeśli chcesz zdefiniować tę metodę na module Math, to powinno załatwić sprawę:

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

Zauważ, że Enumerable.max jest przynajmniej two times slower compared to the ternary operator (?:). Zobacz Dave Morse's answer, aby uzyskać prostszą i szybszą metodę.

13

Jeśli trzeba znaleźć max/min mieszania, można użyć #max_by lub #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] 
19

Wszystkie te wyniki generują śmieci gorliwy próbując obsługiwać więcej niż dwa argumenty. Byłbym ciekawy, jak działają, w porównaniu do dobrego "ol:

def max (a,b) 
    a>b ? a : b 
end 
który jest oficjalną moją oficjalną odpowiedzią na twoje pytanie.:)

+0

Są pewne pogłoski, że Ruby 2.4 optymalizuje '[a, b] .max', ale nadal nie jest jasne, czy jest szybsze niż powyższa implementacja. http://blog.bigbinary.com/2016/11/17/ruby-2-4-implements-array-min-and-max.html –

Powiązane problemy