代码之家  ›  专栏  ›  技术社区  ›  Sergey Mirvoda

IronRuby System.DateTime类

  •  2
  • Sergey Mirvoda  · 技术社区  · 16 年前

    只是编码。

    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)
    >>> 
    

    解决方法:

    >>> i.nil?
    => false
    >>> d.nil?
    => false
    >>> nil
    => nil
    >>> nil.nil?
    => true
    >>>
    
    1 回复  |  直到 16 年前
        1
  •  1
  •   Orion Edwards    16 年前

    据我所知,这种不一致是因为 System.DateTime 定义它自己的==方法,并 System.Int32 没有。 System.Int32 是一个“特殊”类,IronRuby将其直接映射到 Fixnum ,所以当你打电话的时候 System.Int32 == x ,您实际上是在调用内置 Fixnum#== 方法。

    考虑到这一点,以下是发生的情况:

    具有 Int32 菲克努姆

    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 == 系统::日期时间
    IronRuby然后尝试转换 nil 调用这些结构中的一个,以便调用该方法,然后该方法将失败,并出现您看到的错误。

    这看起来不一致吗?对
    事实上是不一致的吗?我认为没有。好吧,没有比任何其他定义它自己的CLR类型更不一致的了 系统::日期时间

    但总的来说,这并不重要。在ruby中检查null的“正确”方法是调用 .nil? ,这与 或任何其他类/结构

    推荐文章