为什么比较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
>>>
答案 0 :(得分: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
Int16
不会映射到任何内容,并且不会超载==
x = System::Int16.MinValue # => -32768 (Int16)
x.class # => System::Int16
x == nil # => Object == nil
DateTime
未映射,但 重载==
x = System::DateTime.Now # => 1/03/2010 9:00:47 a.m.
x.class # => System::DateTime
x == nil # System::DateTime == nil
System::DateTime
重载==
方法仅接受其他System::DateTime
结构
然后IronRuby尝试将nil
转换为其中一个结构,以便它可以调用该方法,然后失败并显示您看到的错误。
这看起来不一致吗?是的。
它实际上是不一致的吗?我不争辩。好吧,没有比定义它自己的==
方法的任何其他CLR类型更不一致。对我来说,只有System::DateTime
总的来说,没关系。在ruby中检查null的“正确”方法是调用.nil?
,这适用于DateTime
或任何其他类/结构