2011-07-01 5 views
0

Object#===の例とメタファーが混乱していることがわかりました。私は現在ソースコードを読むようになっています。どのように分析にこのコードを教えてください:このRubyのソースコードの抜粋を分析する方法

VALUE 
rb_equal(VALUE obj1, VALUE obj2) 
{ 
    VALUE result; 

    if (obj1 == obj2) return Qtrue; 
    result = rb_funcall(obj1, id_eq, 1, obj2); 
    if (RTEST(result)) return Qtrue; 
    return Qfalse; 
} 
+2

コードのどの部分があなたを混乱させるか教えてください。もしそれが "if(obj1 == obj2)return Qtrue;"それは単に「obj1がobj2と同じであれば、この関数は真の真偽値を返す必要があります」 –

答えて

1

VALUEは(intのようなCの型ではなく)CでのRubyのオブジェクトのジェネリック型です。これから、rb_equalが2つのRubyオブジェクト(obj1obj2)を比較する関数であると推論することができます。 2つのオブジェクトが等しい場合、Qtrue(RubyのC言語での真の表現)が返されます。 rb_funcallでない場合は、obj1で等価メソッド(id_eq)を呼び出します。結果が真実ならば(RTEST(result)でチェック)Qtrueが返されます。関数の最後に到達した場合、2つのオブジェクトは明らかに同じではないので、falseを返します(Qfalse)。

+0

Cコードを説明してくれてありがとう – mko