【问题标题】:Undefined method 'to_h' on Ruby arrayRuby数组上的未定义方法'to_h'
【发布时间】:2015-07-28 18:07:58
【问题描述】:

根据Ruby Array documentation,有一个方法to_h,只要数组的每个元素都是另一个包含两个元素的数组,就可以使用该方法将数组转换为散列。以下示例来自同一文档

p [[:foo, :bar], [1, 2]].to_h

但是,当我运行上面的代码时,我得到了这个错误:

irb(main):001:0> p [[:foo, :bar], [1, 2]].to_h
NoMethodError: undefined method `to_h' for [[:foo, :bar], [1, 2]]:Array
        from (irb):1
        from E:/RubyInstall/bin/irb:12:in `<main>'
irb(main):002:0>

我的 Ruby 版本是

C:\>ruby -v
ruby 2.0.0p247 (2013-06-27) [x64-mingw32]

我想使用这种技术来回答有关 Stackoverflow 的另一个问题,但我现在卡住了,因为 Ruby 的文档化功能对我不起作用。

【问题讨论】:

  • 请注意,您仍然可以使用兼容的 Hash::[] 语法,如 Hash[[[:foo, :bar], [1, 2]]] 在 Ruby
  • @engineersmnky 听起来很棒!
  • 您应该至少升级到 v2.1。 2.0 有一些问题(例如Refinements)。
  • @CarySwoveland 当然可以

标签: arrays ruby hash ruby-2.0


【解决方案1】:

to_h 方法仅在 Ruby 2.1 或更高版本中可用。

在此处查看发行说明

http://pivotallabs.com/ruby-2-1-0-changes-of-note/

【讨论】:

  • 谢谢。将升级我的 Ruby。 :-)
【解决方案2】:

是的,低于 Ruby 2.1 的版本不支持,如果您正在寻找替代方案。试试这个

keys = [:foo, :bar]
vals = [1, 2]
Hash[*keys.zip(vals).flatten]
 => {:foo=>1, :bar=>2}

【讨论】:

【解决方案3】:

如果 to_h 尚未定义 - 即在 2.1 之前的 ruby​​ 环境中,以下代码将使用 @engineersmnky 评论中给出的代码对数组进行猴子修补并提供 to_h 方法。

unless [].respond_to? :to_h
  class Array
    def to_h
      Hash[self]
    end
  end
end

【讨论】:

    【解决方案4】:

    Ruby 2.0 不支持 to_h 方法。它在 2.1 及更高版本中可用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-25
      • 2010-10-15
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 2019-12-01
      相关资源
      最近更新 更多