Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中,为什么带有nil的等式(“Date.new==nil”)返回nil?_Ruby_Date_Equality - Fatal编程技术网

在Ruby中,为什么带有nil的等式(“Date.new==nil”)返回nil?

在Ruby中,为什么带有nil的等式(“Date.new==nil”)返回nil?,ruby,date,equality,Ruby,Date,Equality,今天在编写一些rspec时,我遇到了一些将日期(和时间)实例与nil进行比较的意外行为。下面是一个使用原始ruby的示例(没有Rails或其他库): 到目前为止还不错,对吧 >> Date.new == nil => nil >> Time.new == nil => nil Date确实实现了自己的===,工作正常: >> Date.new === nil => false 是否有任何解释说明为什么会发生这种情况或为什么这是期望的行为?

今天在编写一些rspec时,我遇到了一些将日期(和时间)实例与nil进行比较的意外行为。下面是一个使用原始ruby的示例(没有Rails或其他库):

到目前为止还不错,对吧

>> Date.new == nil
=> nil
>> Time.new == nil
=> nil
Date确实实现了自己的===,工作正常:

>> Date.new === nil
=> false
是否有任何解释说明为什么会发生这种情况或为什么这是期望的行为?==似乎是从Comparable.==实现的,但是关于它的文档并没有给出任何返回nil的指示。这个的设计决定是什么

更新!1.9.2中的情况并非如此:

$ irb
ruby-1.9.2-p136 :001 > require 'date'
 => true 
ruby-1.9.2-p136 :002 > Date.new == nil
 => false 
ruby-1.9.2-p136 :003 > Time.new == nil
 => false 

Date类包括
Comparable#=
方法,但该方法调用接收方的
方法。在本例中,这是
Date#
,它需要另一个日期对象。当它接收到
nil
时,它返回
nil
。这种行为显然不一致,我不知道背后的原因。

我检查了来源,下面是我发现的:

Comparable定义的比较运算符都将函数
rb\u cmpint
一起使用<当其中一个操作数为nil时,code>rb_cmpint引发异常


因此,如果rhs与lhs不可比,可比的操作员会提出一个例外。即,
5<2
为假,但
5
引发异常。他们这样做是为了区分
如果代码依赖于此,则始终可以使用.nil?任何Ruby对象响应的方法

>> Date.new.nil?
=> false

这是因为你不能比较那些没有定义的东西。这是可取的,因为如果至少有一个操作数没有定义,那么就无法对结果得出任何结论,这与断言真理不同


许多语言将nil和false视为同一种语言,这纯粹是为了方便起见。这在数学上肯定是不正确的。

FWIW,1.8.7(可能更早)在您给出的比较示例中引发了ArgumentError:>>5<“la”ArgumentError:Fixnum与String的比较失败自(irb):41:in`来这里是因为我正在努力完成,其中包括问题“使用obj.nil是否更好?或者obj==nil#为什么?”我希望有比“nil”更好的答案?就个人而言,在阅读本文时,我再也不会使用“==nil”!如果这是原因,那么这只适用于与nil进行比较。事实并非如此。当你将一个可比较的对象与任何不属于相同类型的对象进行比较时,你会得到nil,例如Date.new==[1,2,3]同样返回nil(除了在1.9中,其中==从不返回nil)。这一点很好。如果“这是因为你不能比较两个不同类型的对象,其中的一个子集是与nil的比较。”:)OP问你为什么不能与nil进行比较,我相信我的答案在这种情况下是正确的;但是,这不是全部原因。
>> Date.new.nil?
=> false