我将应用程序从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 `[]'
我无法在文档或更改日志中找到解释,但我觉得它应该是显而易见的。有人能解释一下有什么变化吗?
答案 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
只接受双元素数组。