2

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

4

1 回答 1

2

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

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

于 2016-06-28T09:05:58.630 回答