gpt4 book ai didi

ruby - 在 Ruby 中,为什么等于 nil ("Date.new == nil") 返回 nil?

转载 作者:数据小太阳 更新时间:2023-10-29 06:34:36 27 4
gpt4 key购买 nike

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

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

到目前为止,还不错吧?

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

最佳答案

我检查了源代码,这是我发现的:

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

因此,如果 rhs 与 lhs 不可比较,则 Comparable 的运算符会引发异常。 IE。 5 < 2是错误的,但是 5 < "la"引发异常。他们这样做是为了区分 < 的情况。不正确是因为 rhs 较小,而在某些情况下它不正确是因为 rhs 不可比较。或者换句话说:当x < y是错误的,这意味着 x >= y是真的。因此,如果不是这种情况,它会抛出异常。

==引发异常是不好的,因为 ==通常不(也不应该)要求其操作数具有可比性。然而==使用与其他操作数相同的方法,但会引发异常。所以整个函数只是简单地包装在 rb_rescue 中。 .然后返回 nil如果抛出异常。

请注意,这仅适用于 ruby​​ 1.8。这已在 1.9 中修复,现在 ==永不返回 nil (当然,如果您定义自己的 == 除外)。

关于ruby - 在 Ruby 中,为什么等于 nil ("Date.new == nil") 返回 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2225669/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com