Odpowiedzi:
Możesz to zrobić
[5, 10].min
lub
[4, 7].max
Pochodzą z modułu Enumerable , więc wszystko, co obejmuje, Enumerable
będzie miało dostęp do tych metod.
Wersja 2.2 wprowadza własne Array#min
i Array#max
, które są znacznie szybsze niż metody Enumerable, ponieważ pomijają wywoływanie #each
.
@nicholasklick wspomina o innej opcji, Enumerable#minmax
ale tym razem zwraca tablicę [min, max]
.
[4, 5, 7, 10].minmax
=> [4, 10]
std::max(4, 7)
ma więcej „interpunkcji” niż [4, 7].max
?
std::max
można je zaimportować do przestrzeni nazw, aby po prostu się stało max(4, 7)
. Czekać; patrząc wyżej widzę, że już to powiedziałem.
Możesz użyć
[5,10].min
lub
[4,7].max
To metoda tablic.
Wszystkie te wyniki generują śmieci w gorliwej próbie obsłużenia więcej niż dwóch argumentów. Byłbym ciekawy, jak wypadają w porównaniu z dobrym „olem”:
def max (a,b)
a>b ? a : b
end
tak przy okazji, moja oficjalna odpowiedź na twoje pytanie.
[a,b].max
, ale nadal nie jest jasne, czy jest szybsze niż powyższa implementacja. blog.bigbinary.com/2016/11/17/…
Jeśli chcesz znaleźć maks / min skrótu, możesz 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]
Oprócz podanych odpowiedzi, jeśli chcesz przekonwertować Enumerable # max na metodę max, która może wywoływać zmienną liczbę lub argumenty, jak w niektórych innych językach programowania, możesz napisać:
def max(*values)
values.max
end
Wynik:
max(7, 1234, 9, -78, 156)
=> 1234
Narusza to właściwości operatora splat do tworzenia obiektu tablicowego zawierającego wszystkie podane argumenty lub pustego obiektu tablicowego, jeśli nie podano argumentów. W drugim przypadku metoda zwróci nil
, ponieważ zwracane jest wywołanie Enumerable # max na pustym obiekcie tablicy nil
.
Jeśli chcesz zdefiniować tę metodę w module Math, powinno to załatwić sprawę:
module Math
def self.max(*values)
values.max
end
end
Zauważ, że Enumerable.max jest co najmniej dwa razy wolniejszy w porównaniu do operatora trójskładnikowego ( ?:
) . Zobacz odpowiedź Dave'a Morse'a na prostszą i szybszą metodę.
def find_largest_num(nums)
nums.sort[-1]
end