我刚刚注意到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
。