首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Ruby中,为什么与nil ("Date.new == nil")的相等返回nil?

在Ruby中,为什么与nil ("Date.new == nil")的相等返回nil?
EN

Stack Overflow用户
提问于 2010-02-09 07:26:08
回答 4查看 3.7K关注 0票数 17

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

代码语言:javascript
复制
user@MacBook-Work ~ $ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]
user@MacBook-Work ~ $ irb
>> 1 == nil
=> false
>> "string" == nil
=> false
>> :sym == nil
=> false
>> false == nil
=> false
>> [] == nil
=> false
>> {} == nil
=> false
>> Proc.new {} == nil
=> false

到目前为止,一切都很好,对吧?

代码语言:javascript
复制
>> Date.new == nil
=> nil
>> Time.new == nil
=> nil

Date确实实现了自己的===,它工作得很好:

代码语言:javascript
复制
>> Date.new === nil
=> false

为什么会发生这种情况,或者为什么这是期望的行为,有什么解释吗?==似乎是从Comparable.==实现的,但是关于它的文档并没有给出任何迹象表明它会返回nil。对此的设计决定是什么?

更新!这不是1.9.2中的情况:

代码语言:javascript
复制
$ 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 
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-09 07:38:04

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

由Comparable定义的比较运算符将函数rb_cmpint<=>一起使用。当其中一个操作数为nil时,rb_cmpint将引发异常。

因此,如果rhs与lhs不具有可比性,则可比较的运营商会提出例外。也就是说,5 < 2为false,但5 < "la"会引发异常。他们这样做是为了区分<不为真的情况,因为rhs较小,以及不为真的情况,因为rhs不可比较。或者换句话说:当x < y为false时,表示x >= y为true。因此,在情况并非如此的情况下,它会抛出异常。

==引发异常将是不好的,因为==通常不(也不应该)要求其操作数是可比较的。但是,==使用与其他操作数相同的方法,这确实会引发异常。因此,整个函数被简单地包装在一个rb_rescue中。如果抛出异常,则返回nil

请注意,这只适用于ruby 1.8。这在1.9中已经修复,现在==永远不会返回nil (当然,除非您定义自己的==返回)。

票数 12
EN

Stack Overflow用户

发布于 2010-02-09 09:18:18

如果您的代码依赖于此,那么您可以始终使用.nil?任何Ruby对象都会响应的方法。

代码语言:javascript
复制
>> Date.new.nil?
=> false
票数 7
EN

Stack Overflow用户

发布于 2010-02-09 07:34:21

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2225669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档