ruby的排序方法是怎么回事?

时间:2011-08-30 21:01:32

标签: ruby

以下代码中“a”和“b”代表什么,<=>如何运作?

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

#=> [5,4,3,2,1]

3 个答案:

答案 0 :(得分: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实现中不稳定。

答案 1 :(得分:3)

我会向后回答你的问题:

<=>是Ruby的组合比较运算符,您可以将其用作简写来确定两个变量中哪一个更大。在您的示例中,如果b更大,则返回1,如果a等于b则返回0,如果a更大,则返回-1

鉴于此,list.sort允许包含block - 即任意代码段,它将替换函数的某些默认行为。

这是您在大括号之间看到的内容:{ |a,b| b <=> a }是一个函数,ab是列表中要比较的两个项目。它使用函数体b <=> a来完成此操作,在这种情况下,按递减顺序对列表进行排序。

这样,您可以通过多种不同的方式对列表中的项进行排序,而无需重写整个排序功能 - 您只需要提供确定列表中两个项中哪一个首先出现的部分。

答案 2 :(得分:-1)

{| a,b | a&lt; =&gt; b}如果“a&lt; = b”升序,可以被认为是“在a之前排序a” {| b,a | a&lt; =&gt; b}可以被认为是“排序b,在a之前”如果“a&lt; = b”下降