`哈希.[]`在Ruby 1.9和2.0中



我正在将一个应用程序从Ruby 1.9.3升级到2.0.0,我遇到了以下问题:

1.9.3-p545 :001 > Hash[[[], 0]]
# => {}

与。

2.0.0-p643 :001 > Hash[[[], 0]]
# ArgumentError: invalid number of elements (0 for 1..2)
# :1:in `[]'

我在文档或变更日志中找不到解释,但我觉得这应该是显而易见的。有人能解释一下发生了什么变化吗?

我也找不到任何文档,但很明显,Ruby从1.9中悄悄丢弃坏数据变成了2.0中出现错误。

文档的相关部分没有从1.9更改为2.0:如果Hash[]得到一个作为数组的参数,那么该数组应该是[key, value]对的数组,并相应地转换为Hash。(在1.9中,Hash[]是进行转换的唯一方法;在2.0中,您可以在数组上调用.to_h。(

[[], 0]中的第一个元素不是[key, value]对,第二个元素也不是。

  • Ruby1.9悄悄地丢弃了这两个元素,产生了一个空的hash。Ruby 1.9确实将数组中的有效元素转换为有效和无效元素:

    Hash[[[], [:a, :b], 0]]] == {:a=>:b}
    
  • Ruby 2(我手头有2.0.0版本以及2.1和2.2的最新版本(并没有悄悄地丢弃无效元素,而是报告了您引用的ArgumentError中的第一个无效元素。

有趣的是,ArgumentError向我们展示了一个未记录的特性:在1.9和2.*中,Hash[]将单个数组参数中的一个元素数组转换为值为nil的哈希键。您可以混合使用单元素数组和双元素数组。此功能必须具有向后兼容性,因为2.*的Array#to_h只接受两个元素数组。

最新更新