私が知る限り、矛盾はSystem.DateTime
独自の == メソッドを定義し、定義してSystem.Int32
いないためです。さらに、System.Int32
は、IronRuby が に直接マップするという点で「特別な」クラスであるFixnum
ため、 を呼び出すとSystem.Int32 == x
、実際には組み込みFixnum#==
メソッドを呼び出していることになります。
それを念頭に置いて、次のことが起こります。
でInt32
、これはにマップされますFixnum
x = System::Int32.MinValue # => -2147483648
x.class # => Fixnum
x == nil # => Fixnum == nil
which は何Int16
にもマップせず、オーバーロードしません==
x = System::Int16.MinValue # => -32768 (Int16)
x.class # => System::Int16
x == nil # => Object == nil
DateTime
which はマップされませんが、オーバーロードされます==
x = System::DateTime.Now # => 1/03/2010 9:00:47 a.m.
x.class # => System::DateTime
x == nil # System::DateTime == nil
オーバーSystem::DateTime
ロードされたメソッドは、他の構造==
のみを受け入れます。
その後、IronRubyはこれらの構造の 1 つに変換してメソッドを呼び出せるようにしようとしますが、表示されたエラーで失敗します。System::DateTime
nil
これは矛盾しているように見えますか? はい。
それは実際には矛盾していますか?私はノーと主張します。==
独自のメソッドを定義する他のどの CLR 型よりも矛盾することはありません。私にとって、特別なケースがあるだけでは意味がありませんSystem::DateTime
一般的には、それは問題ではありません。ruby で null をチェックする「正しい」方法は、 を呼び出すことです。これは、または他のクラス/構造体.nil?
でうまく機能しますDateTime