我刚刚注意到 Ruby 2.2.4 和 Ruby 2.3.0 之间的行为发生了一个非常令人费解的变化:尝试[]
在赋值中使用 nil 不会再引发 a NoMethodError
。
红宝石 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
预期提出 a 。