`Hash。[]`在Ruby中的1.9和2.0

时间:2016-03-10 00:57:01

标签: ruby ruby-2.0 ruby-1.9

我将应用程序从Ruby 1.9.3升级到2.0.0并且我遇到了以下情况:

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

VS

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

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

1 个答案:

答案 0 :(得分:1)

我也找不到任何文档,但很明显Ruby已经从安静地丢弃1.9中的错误数据转变为在2.0中引发错误。

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

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

  • Ruby 1.9悄悄地丢弃这两个元素,导致空哈希。 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只接受双元素数组。