'a'和'b'在以下代碼中代表什麼?<=>
如何工作?在ruby的排序方法中發生了什麼?
list = [1,2,3,4,5]
list.sort { |a,b| b <=> a }
#=> [5,4,3,2,1]
'a'和'b'在以下代碼中代表什麼?<=>
如何工作?在ruby的排序方法中發生了什麼?
list = [1,2,3,4,5]
list.sort { |a,b| b <=> a }
#=> [5,4,3,2,1]
的a
和b
表示一對項目。它可以是從你的原始列表中取出的任何兩個。 <=>
通常被稱爲飛船運營商。如果兩個項目相等,則返回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實現中可能不穩定。
我會向後回答你的問題:
<=>
是Ruby的結合比較操作,您可以使用它作爲短手,以確定哪些兩個變量的較大值。在你的例子中,如果b
更大,它將返回1,如果a
等於b
它將返回0,如果a
更大,則返回-1。
鑑於此,list.sort
允許包含block - 即任意一段代碼,它將取代該函數的某些默認行爲。
這就是你看到的花括號之間的內容:{ |a,b| b <=> a }
是一個函數,並且a
和b
是您的列表中的兩項要比較的項目。它使用函數的主體b <=> a
執行此操作,在這種情況下,按降序對列表進行排序,而不是按升序進行排序。
這種方式,你可以有排序列表中的項目,而無需重寫整個分揀功能的許多不同的方式 - 你只需要提供一個確定哪些列表中的兩個項目先行段。
{| a,b |如果「a < = b」上升 {| b,a | < => b}可以被認爲是「在b之前排序」一個< => b}可以認爲是「排序b,之前」如果「一個< = b」降
@Ryan這個問題不只是關於飛船運營商 –