Ruby 2.3.0:分配给nil,因为Hash不会引发NoMethodError

时间:2016-06-28 08:23:25

标签: ruby ruby-2.3

我刚刚注意到Ruby 2.2.4和Ruby 2.3.0之间的行为发生了非常令人费解的变化:在分配中尝试在nil上使用[]不再引发NoMethodError

Ruby 2.2.4:

box:~ jfoeh$ irb
2.2.4 :001 > a = nil
 => nil 
2.2.4 :002 > a[:b] = 1
NoMethodError: undefined method `[]=' for nil:NilClass
    from (irb):2
from /Users/jfoeh/.rvm/rubies/ruby-2.2.4/bin/irb:11:in `<main>'

相比之下Ruby 2.3.0:

box:~ jfoeh$ irb
2.3.0 :001 > a = nil
 => nil 
2.3.0 :002 > a[:b] = 1
 => nil 

这种行为是预期的,还是这种类型的回归?

当我们发现这样的任务似乎吞噬了2.3中的例外时,我们最初注意到这一点:

2.3.0 :001 > require 'date'
 => true 
2.3.0 :002 > a = nil
 => nil 
2.3.0 :003 > a[:b] = Date.parse(nil)
 => nil

而Ruby 2.2将首先执行右侧并按照预期提升TypeError

1 个答案:

答案 0 :(得分:2)

这是ruby版本2.3.0中引入的错误。从版本2.3.1开始,它已被修复。

Here是在ruby-lang.org上提出的原始问题,而here是解决问题的提交。