【问题标题】:`Hash.[]` in Ruby in 1.9 and 2.0Ruby 1.9 和 2.0 中的 `Hash.[]`
【发布时间】:2016-03-10 00:57:00
【问题描述】:

我正在将应用程序从 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 ruby-2.0 ruby-1.9


    【解决方案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[] 将单个数组参数中的 one 元素数组转换为哈希键,其值为nil。您可以混合使用一元素和二元素数组。这个特性必须是为了向后兼容,因为 2.* 的 Array#to_h 只接受二元素数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      相关资源
      最近更新 更多