2011-08-30 24 views

Trả lời

11

ab đại diện cho một cặp mục. Nó có thể là bất kỳ hai được lấy ra khỏi danh sách ban đầu của bạn. <=> thường được gọi là toán tử tàu vũ trụ. Nó trả về 0 nếu hai mục bằng nhau, -1 nếu một ở bên trái nhỏ hơn và 1 nếu cái bên phải nhỏ hơn.

Có thêm thông tin trên the spaceship operator in the Ruby API docs. Đó là tài liệu cho một trên Fixnum vì đó là những gì đã được trong ví dụ của bạn, nhưng bạn có thể kiểm tra các định nghĩa cho Float, String, vv đó là tốt.

Cập nhật: Chức năng sort dự kiến ​​khối được cung cấp theo hành vi tương tự như toán tử tàu vũ trụ. Nếu đối số đầu tiên, a cần được sắp xếp trước, -1 phải được trả về; nếu đối số thứ hai, b cần được sắp xếp trước, 1 phải được trả về; và vân vân. Vì vậy, trong ví dụ của list.sort { |a,b| a + b } bạn đang nói sắp xếp rằng đối số thứ hai lớn hơn mỗi lần, vì a + b lớn hơn 1 cho mọi kết hợp có thể có trong danh sách đó. Vì vậy, những gì bạn đang nhìn thấy khi bạn nhận được [5,3,1,4,2] về cơ bản là một tạo tác của thứ tự mà các phần tử được chuyển đến khối và có thể sẽ không ổn định trong việc triển khai Ruby.

+3

Thông thường? Lần đầu tiên tôi nghe nó được gọi là 'nhà điều hành tàu vũ trụ'; P – Mchl

+2

Xem http://en.wikipedia.org/wiki/Spaceship_operator và cũng là liên kết "có thể trùng lặp" trong nhận xét của Ryan về câu hỏi. – Emily

+1

Vâng, tôi tin rằng nó được gọi là như vậy. Tôi chỉ ngạc nhiên khi tôi không gặp nó trước đây;) – Mchl

3

Tôi sẽ trả lời câu hỏi của bạn về phía sau:

<=> là toán tử so sánh kết hợp Ruby, và bạn có thể sử dụng nó như ngắn tay để xác định của hai biến lớn. Trong ví dụ của bạn, nếu b lớn hơn, nó sẽ trả về 1, nếu a bằng b, giá trị này sẽ trả về 0 và nếu lớn hơn a thì giá trị này sẽ trả về -1.

Cho rằng, list.sort cho phép bao gồm một block - tức là, một đoạn mã tùy ý sẽ thay thế một số hành vi mặc định của hàm.

Đây là những gì bạn thấy giữa các dấu ngoặc nhọn: { |a,b| b <=> a } là một hàm và ab là hai mục từ danh sách của bạn sẽ được so sánh. Nó thực hiện điều này bằng cách sử dụng phần thân của hàm, b <=> a và trong trường hợp này, sắp xếp danh sách theo thứ tự giảm dần như trái ngược với thứ tự tăng dần. Bằng cách này, bạn có thể có nhiều cách sắp xếp các mục khác nhau trong danh sách mà không cần viết lại toàn bộ chức năng sắp xếp - bạn chỉ cần cung cấp phần xác định mục nào trong hai mục trong danh sách trước tiên.

-1

{| a, b | a < => b} có thể được coi là "sắp xếp a, trước b" nếu "a < = b" tăng dần {| b, a | a < => b} có thể được coi là "sắp xếp b, trước khi" nếu "a" < = b "giảm dần

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