IronRuby System.DateTime NilClass

时间:2010-02-11 09:21:54

标签: .net ironruby dynamic-language-runtime

为什么比较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
>>>

1 个答案:

答案 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或任何其他类/结构