Bob Evans在应用中发现Fixnum#sort并不使用
<=>操作符,代码如下:
class Fixnum
@@count = 0
alias originalComparator <=>
def <=>(o)
@@count += 1
originalComparator(o)
end
def Fixnum.count
@@count
end
end
Running against it:
>array = [5, 4, 3, 2, 1]
=> [5,4,3,2,1]
>array.sort
=> [1,2,3,4,5]
>Integer.count
=> 0
Expected => 6 > result > 0
实际正是如此,这可以从Ruby的源代码中看出:
$ cd /v/build/ruby/ruby-1.8.1-2004.05.02/
$ less array.c
static int
sort_2(ap, bp)
...
if (FIXNUM_P(a) && FIXNUM_P(b)) {
if (a > b) return 1;
if (a < b) return -1;
return 0;
}
if (TYPE(a) == T_STRING && TYPE(b) == T_STRING) {
return rb_str_cmp(a, b);
}
...
static VALUE
sort_internal(ary)
VALUE ary;
{
qsort(RARRAY(ary)->ptr, RARRAY(ary)->len, sizeof(VALUE),
rb_block_given_p()?sort_1:sort_2);
return ary;
}
可见,Ruby确实没有使用<=>,而用最一般的
>,<进行比较。
|