Ruby的排序方法如何与组合比较(太空船)运算符一起使用?

时间:2013-05-17 01:52:53

标签: ruby sorting comparison-operators

在这里开始编程,只是想在使用太空船操作符sort时理解Ruby <=>方法背后的过程。希望有人可以提供帮助。

以下内容:

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

...我了解sort正在一次比较一对数字,如果-1属于ab,则会返回0如果它们相等,或1如果a应该跟b

但是在按降序排序的情况下,如下:

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

......到底发生了什么? sort是否还会比较a <=> b,然后翻转结果?或者它是否以正确的行为来解释return-10的{​​{1}}?

换句话说,为什么要将变量放在块中,如下所示:

1

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

2 个答案:

答案 0 :(得分:4)

a <=> b如果-1属于ab属于0,如果相等,则会返回1a b应该遵循b <=> a 如果-1属于b之前a0属于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。订单很重要。