6

这里是初学程序员,只是想了解一下 Rubysort使用 spaceship operator 的方法背后的过程<=>。希望有人可以提供帮助。

在下面的:

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

...我知道这sort是一次比较一对数字,然后返回-1ifa属于 before b0如果它们相等,或者1if ashould follow b

但是在降序排序的情况下,像这样:

array.sort { |a, b| b <=> a }

...到底发生了什么?是否sort仍然比较a <=> b然后翻转结果?或者它是在解释 , 的sreturn并且具有相反的行为?-101

换句话说,为什么要像这样将变量放在块中:

array.sort { |b, a| b <=> a }

...导致与第一个示例相同的排序模式?

4

2 回答 2

4

a <=> b将返回-1ifa属于 before b0如果它们相等,或者1if ashould follow b
b <=> a将返回-1ifb属于 before a0如果它们相等,或者1if bshould follow a

由于您正在颠倒顺序,因此输出应该被颠倒,就像-运算符一样。3-5-2,并且5-32

array.sort { |b, a| b <=> a }等于,array.sort { |a, b| a <=> b }因为第一个参数在飞船之前,第二个在飞船之后。Ruby 不关心变量的名称是什么。

于 2013-05-17T01:55:09.857 回答
2

排序只是这样做:

comparison_block.call(elem[i],elem[j])

它不知道也不关心你的块在内部是什么样子,但它知道哪个元素作为第一个参数传入,哪个作为第二个参数传入,这就是结果的基础。在正常的数字升序排序中,使用 (1,0) 调用块应该返回 1;用 (0,1) 调用它应该返回 -1。订单很重要。

于 2013-05-17T02:06:36.913 回答