簡単に言うと、各シンボルでto_sを呼び出した後、シンボルをother_symbolと比較します。シンボルがother_symbolより小さいか、等しいか、大きいかに応じて、-1、0、+ 1、またはnilを返します。
nil
2つの値が比較できない場合に返されます。
Symbol#<=>
私は戻ったときにどのように機能するかを理解しようとしていましたnil
。そうすることで、私はコードで遊んだ:
>> :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);
}
しかし、上記のコードは理解できませんでしたが、クラスのオブジェクトではないnil
場合にどのように生成するかという答えがあると思います。LHO
Symbol
誰かがここで私を助けて、そうでないnil
ときにどのように来るのかを理解できますか?LHO
sym