我有一个这样的数组:
my_array = [1,3,5,5,6,7]
从最大到最小排序。我这样做:
my_array.sort { |a,b| b <=> a }
my_array.sort { |a,b| b - a }
两者都返回相同的内容:[7,6,5,5,3,1]
。有人可以解释这两者之间的区别吗?
答案 0 :(得分:3)
document州:
sort→array 排序{| a,b | block}→数组 返回一个数组,其中包含enum排序的项目,根据它们自己的&lt; =&gt;方法,或使用提供的块的结果。该块应返回-1,0或+1,具体取决于a和b之间的比较。从Ruby 1.8开始,方法Enumerable#sort_by实现了一个内置的Schwartzian变换,在密钥计算或比较昂贵时非常有用。
因此,当块的评估值不是-1
,0
或1
时,没有正式提及。如果你做了什么,那么它可能在负数被视为-1
并且正数被视为1
的原则下工作。如果是这种情况,则没有区别。但是,由于没有正式声明,我认为使用{|a, b| b <=> a}
答案 1 :(得分:1)
一个减去,一个使用项目'<=>
运算符。
您使用数字Fixnum
是准确的,因此减去生成< 0
,0
或> 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)
方法并通过使用它来了解您将获得的功能,可以非常轻松地在功能上添加其他功能。