< =>之间的区别是什么? - 在一个块的排序方法?

时间:2014-10-16 15:40:37

标签: ruby sorting comparison

我有一个这样的数组:

my_array = [1,3,5,5,6,7] 

从最大到最小排序。我这样做:

  1. my_array.sort { |a,b| b <=> a }
  2. my_array.sort { |a,b| b - a }
  3. 两者都返回相同的内容:[7,6,5,5,3,1]。有人可以解释这两者之间的区别吗?

4 个答案:

答案 0 :(得分:3)

document州:

  

sort→array   排序{| a,b | block}→数组   返回一个数组,其中包含enum排序的项目,根据它们自己的&lt; =&gt;方法,或使用提供的块的结果。该块应返回-1,0或+1,具体取决于a和b之间的比较。从Ruby 1.8开始,方法Enumerable#sort_by实现了一个内置的Schwartzian变换,在密钥计算或比较昂贵时非常有用。

因此,当块的评估值不是-101时,没有正式提及。如果你做了什么,那么它可能在负数被视为-1并且正数被视为1的原则下工作。如果是这种情况,则没有区别。但是,由于没有正式声明,我认为使用{|a, b| b <=> a}

更安全

答案 1 :(得分:1)

一个减去,一个使用项目'<=>运算符。

您使用数字Fixnum是准确的,因此减去生成< 00> 0

<=>的{​​p> Fixnum调用C例程:

if (x == y) return INT2FIX(0);
if (FIXNUM_P(y)) {
    if (FIX2LONG(x) > FIX2LONG(y)) return INT2FIX(1);
    return INT2FIX(-1);
}

返回-1,0或1,产生相同的结果 - 因为sort只检查符号。

底线是在这个的情况下,没有区别,但这是一个实现细节。

答案 2 :(得分:0)

这是一种技巧。排序数组中使用的块必须返回比较结果,-1(低于b),0(等于b),1(高于b)。

会发生什么,是代码似乎只使用操作的符号,而不是值(b-a)操作返回与b&lt; =&gt;相同的符号。一个操作:

1-10       -9 # neg
1<=>10     -1 # neg

5-5         0 # eq  
5<=>5       0 # eq 

10-1        9 # pos
10<=>1      1 # pos 

但我强烈建议使用比较运算符而不是差异。

答案 3 :(得分:0)

了解<=>正在做什么非常重要,因为它是排序和比较的关键所在:

<=>运算符(AKA&#34;太空船&#34;)告诉我们一个值是否小于,等于或大于另一个值,这使得很容易知道代码何时应该交换它们。例如:

0 <=> 1 # => -1
1 <=> 1 # => 0
2 <=> 1 # => 1

换句话说,-1表示比较小于,0相等,1大于。知道这一点,代码可以通过两种方式之一交换值或忽略交换。

使用-适用于数字,但它会对其他数据类型(如字符串,数组,哈希值)产生非常意外的结果,这些数据类型使用-的方式不同,如果有的话

阅读Comparable模块的文档,通过定义<=>(other)方法并通过使用它来了解您将获得的功能,可以非常轻松地在功能上添加其他功能。