在这里开始编程,只是想在使用太空船操作符sort
时理解Ruby <=>
方法背后的过程。希望有人可以提供帮助。
以下内容:
array = [1, 2, 3]
array.sort { |a, b| a <=> b }
...我了解sort
正在一次比较一对数字,如果-1
属于a
,b
,则会返回0
如果它们相等,或1
如果a
应该跟b
。
但是在按降序排序的情况下,如下:
array.sort { |a, b| b <=> a }
......到底发生了什么? sort
是否还会比较a <=> b
,然后翻转结果?或者它是否以正确的行为来解释return
,-1
和0
的{{1}}?
换句话说,为什么要将变量放在块中,如下所示:
1
...导致与第一个例子中相同的排序模式?
答案 0 :(得分:4)
a <=> b
如果-1
属于a
,b
属于0
,如果相等,则会返回1
,a
b
应该遵循b <=> a
如果-1
属于b
之前a
,0
属于1
,则b
会返回a
,如果-
属于3-5
,则会-2
关注5-3
。
由于您正在颠倒顺序,因此输出应该反转,就像2
运算符一样。 array.sort { |b, a| b <=> a }
为array.sort { |a, b| a <=> b }
,{{1}}为{{1}}。
{{1}}等于{{1}}因为第一个参数在宇宙飞船之前,第二个参数在之后。 Ruby不关心变量的名称是什么。
答案 1 :(得分:2)
排序就是这样:
comparison_block.call(elem[i],elem[j])
它不知道或关心你的块在内部看起来像什么,但它知道它作为第一个参数传入哪个元素,哪个作为第二个参数,这就是结果的基础。在正常的数字升序排序中,用(1,0)调用块应该返回1;用(0,1)调用它应该返回-1。订单很重要。