2

null との比較が非常に不安定なのはなぜですか?

コードするだけです。

IronRuby 0.9.4.0 on .NET 2.0.50727.4927
Copyright (c) Microsoft Corporation. All rights reserved.

>>> require 'System'
=> true
>>> i = System::Int32.MinValue
=> -2147483648
>>> i==nil
=> false
>>> d = System::DateTime.Now
=> 11.02.2010 14:15:02
>>> d==nil
(ir):1: can't convert NilClass into System::DateTime (TypeError)
>>> 

9.1 では、このコードは期待どおりに機能します。

編集:

回避策:

>>> i.nil?
=> false
>>> d.nil?
=> false
>>> nil
=> nil
>>> nil.nil?
=> true
>>>
4

1 に答える 1

1

私が知る限り、矛盾は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

DateTimewhich はマップされませんが、オーバーロードされます==

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

于 2010-02-28T20:03:41.820 に答える