以下代码中“a”和“b”代表什么,<=>
如何运作?
list = [1,2,3,4,5]
list.sort { |a,b| b <=> a }
#=> [5,4,3,2,1]
答案 0 :(得分:11)
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实现中不稳定。
答案 1 :(得分:3)
我会向后回答你的问题:
<=>
是Ruby的组合比较运算符,您可以将其用作简写来确定两个变量中哪一个更大。在您的示例中,如果b
更大,则返回1,如果a
等于b
则返回0,如果a
更大,则返回-1
鉴于此,list.sort
允许包含block - 即任意代码段,它将替换函数的某些默认行为。
这是您在大括号之间看到的内容:{ |a,b| b <=> a }
是一个函数,a
和b
是列表中要比较的两个项目。它使用函数体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”下降