2010-02-11 50 views
2

爲什麼與null比較是如此不穩定?IronRuby System.DateTime NilClass

只是代碼。

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

這是一種解決方法。這是你如何定期檢查Ruby中的否定。 – 2010-02-11 13:10:41

+0

@Shay Friedman WTF沒有在檢查,它在_inconsistency_ – 2010-02-11 14:11:09

+0

+1爲「WTF」的問題。 – mxmissile 2010-02-11 18:07:31

回答

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或任何其他類/結構可以很好地配合使用

+0

@Orion Edwards是的,你所有的關於映射。但它絕對是一個錯誤,在Ruby中的空檢查應該是安全的。查看來自Jimmy的評論的codeplex鏈接。我把你的答案標記爲正確:) – 2010-02-28 21:14:48

+0

我沒有看到Jimmy在該Codeplex鏈接上的任何評論?我看到的唯一評論是來自Tomas,他基本上說了同樣的事情,我做了 – 2010-02-28 21:26:43

+0

哦,對不起。是的,來自Tomas的評論。但問題狀態由Jimmy Schementi更改爲Active,並且計劃將_change_ – 2010-02-28 22:24:43