`Hash.[]` in Ruby in 1.9 and 2.0

`Hash.[]` in Ruby in 1.9 and 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 to 2.0 相比没有变化:如果 Hash[] 得到一个数组参数,则该数组应该是 [=12= 的数组] 对,并相应地转换为 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 我手边都有)报告第一个无效元素,而不是悄悄地丢弃无效元素18=] 你引用。

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