2013-05-17 41 views
6

Bắt đầu lập trình ở đây, chỉ muốn hiểu quy trình phía sau phương thức sort của Ruby khi sử dụng toán tử tàu vũ trụ <=>. Hy vọng ai đó có thể giúp đỡ.Phương thức sắp xếp của Ruby hoạt động như thế nào với toán tử so sánh kết hợp (spaceship)?

Trong điều sau đây:

array = [1, 2, 3] 
array.sort { |a, b| a <=> b } 

... Tôi hiểu rằng sort được so sánh một cặp số tại một thời điểm và sau đó trở -1 nếu a thuộc trước b, 0 nếu họ bình đẳng, hoặc 1 nếu a nên theo dõi b.

Nhưng trong trường hợp sắp xếp theo thứ tự giảm dần, như vậy:

array.sort { |a, b| b <=> a } 

... chính xác những gì đang xảy ra? Hiện sort vẫn còn so sánh a <=> b và sau đó lật kết quả? Hoặc là nó giải thích các return s của -1, 01 với hành vi đảo ngược?

Nói cách khác, tại sao không đặt các biến trong khối như sau:

array.sort { |b, a| b <=> a } 

... dẫn đến việc mô hình phân loại tương tự như trong ví dụ đầu tiên?

Trả lời

4

a <=> b sẽ trở lại -1 nếu a thuộc trước b, 0 nếu họ bình đẳng, hoặc 1 nếu a nên làm theo b.
b <=> a sẽ trở lại -1 nếu b thuộc trước a, 0 nếu họ bình đẳng, hoặc 1 nếu b nên làm theo a.

Vì bạn đang đảo ngược thứ tự, đầu ra phải được đảo ngược, giống như toán tử -, ví dụ. 3-5-25-32.

array.sort { |b, a| b <=> a } bằng array.sort { |a, b| a <=> b } vì đối số đầu tiên nằm trước tàu vũ trụ và cuộc tranh luận thứ hai là sau. Ruby không quan tâm tên biến là gì.

+0

Vì vậy, nó đang sử dụng thứ tự được chỉ định trong biến khối làm tham chiếu? – vertigokidd

+0

@vertigokidd Chà, bạn còn kỳ vọng Ruby biết cái nào được cho là đối số đầu tiên và cái nào thứ hai? Một lần nữa, Ruby không quan tâm đến tên biến của bạn. – Doorknob

+0

@vertigokidd: Có lẽ bạn đang bối rối bởi kinh nghiệm trước đây với các biến '$ a' và' $ b' ma thuật mà Perl sử dụng với ['sort' blocks] (http: //perldoc.perl.org/functions/sort.html). –

2

Sắp xếp chỉ thực hiện điều này:

comparison_block.call(elem[i],elem[j]) 

Nó không biết hoặc quan tâm những gì khối của bạn trông giống như trong nội bộ, nhưng nó biết yếu tố nào nó được thông qua vào như là đối số đầu tiên và đó là thứ hai, và đó là kết quả là gì. Trong một kiểu tăng dần số bình thường, gọi khối với (1,0) sẽ trả về 1; gọi nó bằng (0,1) phải trả về -1. Đặt hàng các vấn đề.

+0

"Các vấn đề đặt hàng". Đó thực sự là tất cả những gì tôi cần nghe. Cảm ơn! – vertigokidd

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