【问题标题】:IronRuby System.DateTime NilClassIronRuby System.DateTime NilClass
【发布时间】:2010-02-11 09:21:54
【问题描述】:

为什么与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
>>>

【问题讨论】:

  • 现在这是一种解决方法。这就是你在 Ruby 中定期检查 nulity 的方式。
  • @Shay Friedman WTF 不在检查中,它在不一致
  • +1 表示问题中的“WTF”。
  • +1 我们应该向 IronRuby 团队填写一个错误。我知道 .NET (CLR) 中的 DateTime 也不能为空,只有 MinValue 和 MaxValue。除非实现 Nullable 类型。但它应该作为整数工作。

标签: .net ironruby dynamic-language-runtime


【解决方案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 或任何其他类/结构

【讨论】:

  • @Orion Edwards 是的,关于映射,你说得对。但这绝对是一个错误,空值检查在 ruby​​ 中应该是安全的。 Jimmy 的评论见 codeplex 链接。不过,我将您的答案标记为正确:)
  • 我没有看到 Jimmy 对该 Codeplex 链接的任何评论?我看到的唯一评论来自 Tomas,他说的和我基本一样
  • 哦,对不起。是的,来自托马斯的评论。但是问题状态被 Jimmy Schementi 更改为 Active 并且计划更改
猜你喜欢
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多