simply says: Compares symbol with other_symbol after calling to_s on each of the symbols. Returns -1, 0, +1 or nil depending on whether symbol is less than, equal to, or greater than other_symbol.
nil
is returned if the two values are incomparable.
我試圖返回nil
時瞭解Symbol#<=>
作品。這樣我打的代碼:
>> :x.to_s
=> "x"
>> 'x'.to_s
=> "x"
從上面的IRB
代碼我想返回值將是0
。但實際是nil
。由於doc說在使用<=>
運算符to_s
之前應用RHO
和LHO
。但在這裏,下面的代碼不支持這個原則,在我看來。
>> :x <=> "x"
#=> nil
於是,我就看到源代碼,來回答自己:
static VALUE
sym_cmp(VALUE sym, VALUE other)
{
if (!SYMBOL_P(other)) {
return Qnil;
}
return rb_str_cmp_m(rb_sym_to_s(sym), rb_sym_to_s(other));
}
查看源代碼,很顯然,如果RHO
不是Symbol
類的對象,nil
將返回。讓我們來看看一些 更IRB:
>> "x" <=> :x
#=> nil
再次nil
。源代碼說現在將執行rb_str_cmp_m(rb_sym_to_s(sym),rb_sym_to_s(other))
。所以現在我去看看STRING.C
的源代碼。所以我們基本上是傾向於rb_str_cmp_m(???,"x")
。現在從github上發現了我:(?
手段不知道是什麼值)
rb_str_cmp_m(VALUE str1, VALUE str2)
{
int result;
if (!RB_TYPE_P(str2, T_STRING)) {
VALUE tmp = rb_check_funcall(str2, rb_intern("to_str"), 0, 0);
if (RB_TYPE_P(tmp, T_STRING)) {
result = rb_str_cmp(str1, tmp);
}
else {
return rb_invcmp(str1, str2);
}
}
else {
result = rb_str_cmp(str1, str2);
}
return INT2FIX(result);
}
但上面的代碼我不能understand.But我beleieve它有多麼nil
正在生產的答案時LHO
不是對象類Symbol
。
任何人都可以幫助我瞭解nil
在LHO
是不是sym
?
仔細看看,是不是'rb_str_cmp_m(rb_sym_to_s(sym),rb_sym_to_s(other))' 'nil'是上面的行:'if(!SYMBOL_P(other)){return Qnil; }' – fmendez 2013-03-17 12:33:42
@fmendez是看得很清楚'other'是'RHO'。我正在談論'LHO'。它首先檢查'RHO'如果'sym'或不。如果'RHO'是'sym',那麼它只是在'LHO和RHO'上調用'to_s'返回語句。 – 2013-03-17 12:35:31
也許你覺得<=>是一個運營商(因此你在談論LHO和RHO)時感到困惑。這不是一個真正的操作符,而是一種方法(因此您應該談論接收者和參數)。 LHO是接收器。我已經擴大了我的答案以澄清。 – AlexChaffee 2013-03-17 12:42:05