2009-08-31 44 views

Trả lời

582

Bạn có thể làm

[5, 10].min 

hoặc

[4, 7].max 

Họ đến từ Enumerable module, vì vậy bất cứ điều gì trong đó bao gồm Enumerable sẽ có những phương pháp có sẵn.

EDIT

@nicholasklick đề cập đến một lựa chọn, Enumerable#minmax, nhưng lần này trở về một mảng của [min, max].

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

Nó không có vẻ rất thú vị với chỉ có 2 giá trị trong mảng ban đầu, vì vậy

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

Thật đẹp! – Ziggy

+8

Hoặc bạn chỉ cần http://www.ruby-doc.org/core-2.0/Enumerable.html#method-i-minmax – nicholasklick

+0

Cảm ơn @nicholasklick, vừa cập nhật câu trả lời của tôi. Thậm chí không biết rằng đã tồn tại! – theIV

45

Bạn có thể sử dụng

[5,10].min 

hoặc

[4,7].max 

Đó là một phương thức cho mảng.

+18

Về mặt kỹ thuật, nó là một phương pháp cho Số đếm, chứ không phải là Mảng. – meagar

18

Ngoài các câu trả lời được cung cấp, nếu bạn muốn chuyển đổi Enumerable#max thành một phương pháp tối đa có thể gọi một số biến hoặc đối số, như trong một số ngôn ngữ lập trình khác, bạn có thể viết:

def max(*values) 
values.max 
end 

Output:

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

Điều này lạm dụng thuộc tính của toán tử splat để tạo đối tượng mảng chứa tất cả đối số được cung cấp hoặc đối tượng mảng trống nếu không có đối số nào được cung cấp. Trong trường hợp thứ hai, phương thức sẽ trả về nil, vì gọi số Enumerable#max trên một đối tượng mảng trống trả về nil.

Nếu bạn muốn xác định phương pháp này trên các mô-đun Math, điều này sẽ làm các trick:

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

Lưu ý rằng Enumerable.max là, ít nhất, two times slower compared to the ternary operator (?:). Xem Dave Morse's answer để có phương thức đơn giản và nhanh hơn.

13

Nếu bạn cần phải tìm ra max/min của một hash, bạn có thể sử dụng #max_by hoặc #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

Tất cả những kết quả tạo ra rác trong một nỗ lực nhiệt tâm để xử lý hơn hai đối số. Tôi rất tò mò muốn xem chúng hoạt động như thế nào so với hiệu quả 'ol:

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

là câu trả lời chính thức cho câu hỏi của bạn.:)

+0

Có một số rắc rối mà Ruby 2.4 đang tối ưu hóa '[a, b] .max', nhưng nó vẫn không rõ ràng nếu nó nhanh hơn so với thực hiện ở trên. http://blog.bigbinary.com/2016/11/17/ruby-2-4-implements-array-min-and-max.html –

Các vấn đề liên quan