просто говорит: сравнивает символ с other_symbol после вызова to_s для каждого из символов. Возвращает -1, 0, +1 или ноль в зависимости от того, меньше, равно или больше значение параметра other_symbol.
nil
возвращается, если два значения несопоставимы.
Я пытался понять, как работает Symbol#<=>
при возврате nil
. При этом я играл с кодом:
>> :x.to_s
=> "x"
>> 'x'.to_s
=> "x"
Из приведенного выше кода IRB
я подумал, что возвращаемое значение будет 0
. Но на самом деле это nil
. Как говорится в документе, перед использованием <=>
оператор 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
< /em>. Таким образом, мы в основном проезжаем 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);
}
Но приведенный выше код я не мог понять. Но я считаю, что в нем есть ответ, как 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; }
- person fmendez   schedule 17.03.2013other
этоRHO
. Я говорю оLHO
. Сначала он проверяетRHO
, еслиsym
или нет. ЕслиRHO
равноsym
, то он просто вызывает оператор return с вызовомto_s
для обоихLHO and RHO
. - person Arup Rakshit   schedule 17.03.2013