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

5

作为一名初学者,我想了解使用 Ruby 的 sort 方法时,如何使用太空船运算符 <=>。希望有人能帮忙。

接下来是详细内容:

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然后翻转结果吗?还是解释-101return值时行为相反?

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

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

在第一个示例中排序模式是否与结果相同?
2个回答

4
a <=> b 表示如果 a 应该在 b 之前,返回 -1,如果相等,返回 0,如果 a 应该在 b 之后,返回 1
b <=> a 表示如果 b 应该在 a 之前,返回 -1,如果相等,返回 0,如果 b 应该在 a 之后,返回 1

由于您正在反转顺序,因此输出应该像减法运算符一样被反转。例如,3-5-25-32

array.sort { |b, a| b <=> a } 等同于 array.sort { |a, b| a <=> b },因为第一个参数在太空船运算符之前,第二个参数在之后。Ruby 不关心变量的名称。


那么它是按照块变量中指定的顺序作为参考吗? - vertigokidd
@vertigokidd 你还期待 Ruby 怎么知道哪个是第一个参数,哪个是第二个参数吗?再说一遍,Ruby 不关心你的变量名。 - tckmn
@vertigokidd:也许你会因之前接触 Perl 中使用 sort 时神奇的 $a$b 变量而感到困惑。 - mu is too short

2

排序只是做这个:

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

它并不知道或关心你的块在内部长什么样子,但它知道哪个元素作为第一个参数传递,哪个作为第二个参数传递,并且结果是基于此的。在正常的数字升序排序中,调用带有(1,0)的块应返回1;调用带有(0,1)的块应返回-1。顺序很重要。


顺序很重要。这就是我需要听到的。谢谢! - vertigokidd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接