2011-08-30 56 views

回答

11

ab表示一對項目。它可以是從你的原始列表中取出的任何兩個。 <=>通常被稱爲飛船運營商。如果兩個項目相等,則返回0;如果左邊的項目較小,則返回-1;如果右邊的項目較小,則返回1。

還有更多關於the spaceship operator in the Ruby API docs的信息。這是Fixnum上的文檔,因爲在你的例子中是這樣的,但你也可以在那裏查看Float,String等的定義。

更新:sort函數期望它給出的塊遵循與太空船操作符相同的行爲。如果第一個參數a應該先排序,則返回-1;如果第二個參數b應該先排序,則返回1;等等。因此,在list.sort { |a,b| a + b }的示例中,您告訴排序第二個參數每次更大,因爲對於該列表中的每個可能的組合,a + b都大於1。所以當你得到[5,3,1,4,2]時你所看到的基本上是元素被傳遞給塊的順序的人工產物,並且在Ruby實現中可能不穩定。

+3

通常?我第一次聽到它叫'飛船運營商'; P – Mchl

+2

查看http://en.wikipedia.org/wiki/Spaceship_operator以及Ryan對這個問題的評論中的「可能重複」鏈接。 – Emily

+1

是的,我相信這就是所謂的。我只是感到驚訝,我沒有遇到過;) – Mchl

3

我會向後回答你的問題:

<=>是Ruby的結合比較操作,您可以使用它作爲短手,以確定哪些兩個變量的較大值。在你的例子中,如果b更大,它將返回1,如果a等於b它將返回0,如果a更大,則返回-1。

鑑於此,list.sort允許包含block - 即任意一段代碼,它將取代該函數的某些默認行爲。

這就是你看到的花括號之間的內容:{ |a,b| b <=> a }是一個函數,並且ab是您的列表中的兩項要比較的項目。它使用函數的主體b <=> a執行此操作,在這種情況下,按降序對列表進行排序,而不是按升序進行排序。

這種方式,你可以有排序列表中的項目,而無需重寫整個分揀功能的許多不同的方式 - 你只需要提供一個確定哪些列表中的兩個項目先行段。

-1

{| a,b |如果「a < = b」上升 {| b,a | < => b}可以被認爲是「在b之前排序」一個< => b}可以認爲是「排序b,之前」如果「一個< = b」降

相關問題