我正在将一个应用程序从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
只接受两个元素数组。